如何得到不匹配的模式:正则表达式没有跟着另一个正则表达式
问题描述:
这显然是一个简化的情况,但什么需要是一个正则表达式,将不会匹配aabb|bbaa
,但会正常工作aabb
(不跟随|...
)。如何得到不匹配的模式:正则表达式没有跟着另一个正则表达式
像[ab]+(?!\|[ab]+)*
一个正则表达式是相当接近,但它仍然与从aabb|bbaa
aabb
,而我想获得不匹配在这种情况下,所有。
使用起始字符串(^
)和字符串结尾($
)锚是不允许的。
答
没有规则,您必须在一个正则表达式中表达所有内容。它也使代码不可读。我建议像
not (matches "aabb\|bbaa") and (matches "aabb")
如果你坚持,你可以使用
([ab]+)(\|[ab]+)*
并放弃了比赛,如果第二组不为空。
答
你实际上需要锚在你先行,一种方式或其他
[ab]+(?=[^ab]*\z)
在更一般的,在那里a
和b
是任意subexressions,您需要:
(?: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
)
+0
这里只有一种模式。我将其简化为'[ab] +',但如果将其称为'p',问题将是:如何使Matcher#find()对于'p \ p'返回false,但对于'p'则为true。注意转义'|'。 – zaza 2013-04-04 18:51:49
这听起来像你使用错误的“匹配”方法。使用Matcher#matches()来匹配整个输入序列。 – 2013-04-04 18:06:23
我使用Matcher#find(),然后将第一个组作为结果找到。我无法改变这一点。 – zaza 2013-04-04 18:34:08
你不能改变使用的方法,也不能添加'^ $'锚点?什么是看似任意的限制?这是面试问题吗? – 2013-04-04 18:37:01