2013-04-04 70 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