【问题标题】:regular expression to match regular expression flags "ismU"正则表达式匹配正则表达式标志“ismU”
【发布时间】:2018-07-17 01:27:07
【问题描述】:

我正在尝试编写一个正则表达式来匹配“ismU”标志。 要求如下: 1) 每个字符最多只出现一次 2)字符可以按任意顺序出现:“is”、“si”、“mi”、“smi”、“uims”

要求1)导致“?”量词,和 2) 导致 "|"交替。

“i?|U?|m?|s?”只能适用于长度为 1。

"[imsU]{1,4}" 可以适用于长度为 4,但它接受重复的标志(例如,“ii”)

测试用例为真:[ "i", "im", "mi", "Ums", "iUsm"]; 测试用例为 False:[ "I", "mm"].

【问题讨论】:

  • 使用字符串函数可能更容易。
  • 带有反向引用:^(?!.*(.).*\1)[imsU]+$
  • @CasimiretHippolyte 我喜欢它。发表您的评论作为答案。

标签: regex


【解决方案1】:

您可以使用否定的前瞻断言来测试字符是否重复(在任何地方)。为了表达这一点,您需要一个捕获组(.) 和一个对捕获\1 的引用。

^(?!.*(.).*\1)[imsU]+$

请注意,您不必使用比 + 更精确的量词,因为前瞻已经两次检查没有相同的字符,并且字符类中只有四个不同的字符。

但是,为了更高效(特别是避免在长字符串上测试.*(.).*\1),您也可以这样编写模式:

^(?!.{0,2}(.).{0,2}\1)[imsU]{1,4}$

【讨论】:

  • 致所有想在正则表达式中使用负前瞻的人:stackoverflow.com/questions/32862316/… 此链接显示了在整个正则表达式中使用捕获组的示例,除了前瞻。这是我的工作:re.compile("((\?(?!.{0,2}(.).{0,2}\\2)[imsU]{1,4}))\ ^(.*)")
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-30
  • 2011-05-01
相关资源
最近更新 更多