2010-09-22 72 views
2

只有當中間沒有「B」時,我需要一個匹配A.*C的正則表達式。 「A.*C之前和之後沒有B」,任何字符串都被允許(包括A,B和C)。
對於較長的字符串,「A」,「B」和「C」爲佔位符
所以正則表達式應該匹配ie。 「AfooC」,「AfooCbarB」,「A C B A」,但不是「AfooBbarC」或「A B C B」。正則表達式問題:如何確定A和C之間沒有B?

我想我需要A和B之間的某處.*,所以我嘗試(其中包括)這兩個:
A.*(?!B).*C不起作用,因爲.*後A「吃」的B.
A(?!.*B).*C沒有按」 t工作,因爲它不符合ACB。 (這次,第一個.*「吃」了「C」)。

可能我錯過了一些明顯的東西 - 我無法弄清楚如何去做。

感謝您的幫助,朱利安

(編輯:有一些格式的麻煩...)

+2

您的問題的答案可能取決於所使用的正則表達式語法。有人問.NET相同的正則表達式[there](http://bytes.com/topic/net/answers/103977-regular-expression-match-all-except)。 – stakx 2010-09-22 19:37:00

+0

問題是A,B,C不是單個字符。 – jasamer 2010-09-22 19:41:43

回答

4

實現這一目標最簡單的方法是使用lookarounds

A((?!B).)*C 

此模式將匹配A,然後是任意數量的字符,然後C。但是,由於.上的負向預測,該點只會在不消耗B的情況下匹配。

+0

天才。非常感謝。 – jasamer 2010-09-22 20:11:56

1

A[^B]*C怎麼樣? [^B]是匹配「除字母'B'之外的任何字符類」。

+0

這也是我的第一本能,但是'B'是一個比一個字符更長的東西的佔位符,所以一個字符類不會在這裏工作。 – 2010-09-22 19:31:35

+0

@Daniel:Bah。我想念Perl 6的正則表達式。 – tadzik 2010-09-22 19:34:22

-1

「A [^ B] * C」。匹配A,然後是任意數量的不是B的字符,然後是C.

+0

「B」是一個較長字符串的佔位符。如果「B」是「XYZ」,則正則表達式應該是「A [^(XYZ)] \ * B」 - 但即使我需要的正則表達式不匹配「AXB」。 – jasamer 2010-09-22 19:34:55

0

爲什麼不是/A(?!.*B.*(C)).*?C/

+0

你爲什麼在前瞻中捕捉到C? – 2010-09-22 19:57:41

+0

此外,該模式無法在「A C B C」上匹配。 – 2010-09-22 20:01:13

+0

關閉...但它不符合「A C B C」...也許我仍然沒有足夠準確地描述,在「A C」之後沒有「B」之間可以有任何字符串...... – jasamer 2010-09-22 20:06:11

0

如何:

\AA.+(?<!(.*cheesey.*))C\Z 

(?<!(.*cheesey.*))做了負回顧後的圖案.*cheesey.*,如果找到匹配停止匹配。儘管'cheesey'可能在最後,但錨在那裏阻止它切斷端部並匹配中間。