這顯然是一個簡化的情況,但什麼需要是一個正則表達式,將不會匹配aabb|bbaa
,但會正常工作aabb
(不跟隨|...
)。如何得到不匹配的模式:正則表達式沒有跟着另一個正則表達式
像[ab]+(?!\|[ab]+)*
一個正則表達式是相當接近,但它仍然與從aabb|bbaa
aabb
,而我想獲得不匹配在這種情況下,所有。
使用起始字符串(^
)和字符串結尾($
)錨是不允許的。
這顯然是一個簡化的情況,但什麼需要是一個正則表達式,將不會匹配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
)
這裏只有一種模式。我將其簡化爲'[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