1

这显然是一个简化的情况,但需要的是一个不匹配aabb|bbaa但可以正常工作的正则表达式aabb(不跟随|...)。

像这样的正则表达式[ab]+(?!\|[ab]+)*非常接近,但它仍然匹配aabbfrom ,而在这种情况下aabb|bbaa我想根本不匹配。

不允许使用字符串开头 ( ^) 和字符串结尾 ( ) 锚点。$

4

2 回答 2

0

你实际上确实需要在你的前瞻中锚定,一种或另一种

 [ab]+(?=[^ab]*\z)

更一般地说,在哪里ab是任意子表达式,您需要:

 (?:a|b)+(?=(?s:(?!a)(?!b).)*\z)

为了易读性和可维护性,应始终以/x模式编写:

 (?x)           # enable white space and comments

 (?: a          # any a
   | b          # or b
 ) +            # repeated once or more, preferring more

 # now a lookahead assertion
 (?=
     (?s: (?!a)  # not a coming right up at this point
          (?!b)  # nor b coming  right up at this point
          .      # any single code point
     ) *         # repeated zero or more times
     \z          # anchored to the end of the string
  )
于 2013-04-04T18:20:52.377 回答
0

没有规定必须用一个正则表达式表达所有内容。它还使代码不可读。我会建议像

not (matches "aabb\|bbaa") and (matches "aabb")

如果你坚持,你可以使用

([ab]+)(\|[ab]+)*

如果第二组不为空,则丢弃匹配项。

于 2013-04-04T18:19:51.300 回答