2013-04-04 45 views
1

这显然是一个简化的情况,但什么需要是一个正则表达式,将不会匹配aabb|bbaa,但会正常工作aabb(不跟随|...)。如何得到不匹配的模式:正则表达式没有跟着另一个正则表达式

[ab]+(?!\|[ab]+)*一个正则表达式是相当接近,但它仍然与从aabb|bbaaaabb,而我想获得不匹配在这种情况下,所有

使用起始字符串(^)和字符串结尾($)锚是不允许的。

+2

这听起来像你使用错误的“匹配”方法。使用Matcher#matches()来匹配整个输入序列。 – 2013-04-04 18:06:23

+0

我使用Matcher#find(),然后将第一个组作为结果找到。我无法改变这一点。 – zaza 2013-04-04 18:34:08

+1

你不能改变使用的方法,也不能添加'^ $'锚点?什么是看似任意的限制?这是面试问题吗? – 2013-04-04 18:37:01

回答

0

没有规则,您必须在一个正则表达式中表达所有内容。它也使代码不可读。我建议像

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

如果你坚持,你可以使用

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

并放弃了比赛,如果第二组不为空。

+0

我只允许更改正则表达式。引用它的代码使用Matcher#find()和组来查找匹配的文本。 – zaza 2013-04-04 18:35:45

+0

请告诉那些建立这些规则的人,他们是一群<在此插入喜爱的脏话>白痴。 – Ingo 2013-04-04 18:38:56

+0

不过,如果这就像是你有一个配置文件或者其他的配置文件,用拒绝和允许规则,那么首先使用'拒绝a \ | b',后面跟'allow a'。如果你只有允许规则,你就搞砸了。 – Ingo 2013-04-04 18:42:06

0

你实际上需要锚在你先行,一种方式或其他

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

在更一般的,在那里ab是任意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