这显然是一个简化的情况,但需要的是一个不匹配aabb|bbaa
但可以正常工作的正则表达式aabb
(不跟随|...
)。
像这样的正则表达式[ab]+(?!\|[ab]+)*
非常接近,但它仍然匹配aabb
from ,而在这种情况下aabb|bbaa
我想根本不匹配。
不允许使用字符串开头 ( ^
) 和字符串结尾 ( ) 锚点。$
这显然是一个简化的情况,但需要的是一个不匹配aabb|bbaa
但可以正常工作的正则表达式aabb
(不跟随|...
)。
像这样的正则表达式[ab]+(?!\|[ab]+)*
非常接近,但它仍然匹配aabb
from ,而在这种情况下aabb|bbaa
我想根本不匹配。
不允许使用字符串开头 ( ^
) 和字符串结尾 ( ) 锚点。$
你实际上确实需要在你的前瞻中锚定,一种或另一种
[ab]+(?=[^ab]*\z)
更一般地说,在哪里a
和b
是任意子表达式,您需要:
(?: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
)
没有规定必须用一个正则表达式表达所有内容。它还使代码不可读。我会建议像
not (matches "aabb\|bbaa") and (matches "aabb")
如果你坚持,你可以使用
([ab]+)(\|[ab]+)*
如果第二组不为空,则丢弃匹配项。