2011-04-03 208 views
0

我想知道是否有可能排除一組中的比賽的部分內的子字符串。正則表達式:不包括組

我認爲/(foo((?:bar)|(bad)))/結果匹配「foobar」或「foobad」和組1包含「foobar」或「foobad」。我希望它匹配「foobar」或「foobad」,但組1只包含「foo」或「foobad」。我知道(?:...)正則表達式語法用於創建一個以後不能引用的組,但上面的用法意味着有3個組:\ 1整個匹配; \ 2無論是「酒吧」還是「壞」; \ NONE是一個未使用的組「酒吧」;和\ 3爲'壞'。

你看我要去哪裏嗎?我想有選擇地排除另一個組內的子組。

另外,我想在一個或時尚/(foobar)|(foobad)/定義組1的兩倍,雖然我知道,輸入不會做我想要的。在這種情況下,如果輸入「foobad」,試圖訪問match[1]會導致「未定義」錯誤。我知道這是因爲它實際上是拆分爲第1組和或組2

我在JavaScript正則表達式方言寫的。

回答

4

我希望它匹配「foobar」或「foobad」,但組1只包含「foo」或「foobad」。

正則表達式:

/(foo(?:(?=bar)|bad))/ 

確實的是:第1組或者包含foo(僅當bar之後談到直接地)或者它包含foobad

+0

好的答案。出於某種原因,我認爲JS不支持預測,但它確實如此,所以這會很好地工作。 (一旦parens匹配,無論如何;) – 2011-04-03 19:47:27

+1

謝謝你的修正添:)。是的,JS支持前瞻,但不支持後視。 – 2011-04-03 19:49:18

+0

應該指出,這將改變任何後續比賽的行爲。例如'(foo(?:(?= bar)| bad))x'將與foobadx匹配,但不匹配foobarx。 – 2011-04-03 19:55:51

0

(?:bar) - 匹配酒吧但不記得匹配。這些被稱爲非捕獲括號。無法從結果數組的元素[1], ..., [n]或從預定義的RegExp對象的屬性$1, ..., $9中調用匹配的子字符串。

進一步信息:Mozilla Developer Center

+0

你錯過了點,他不希望在組1捕捉 「欄」 – 2011-04-03 19:37:23

+1

'[欄|壞]'只是一個字符匹配:'B','了','r','|'或'd' – 2011-04-03 19:38:08

+0

@BartPiers - 對,我的錯,糾正了它。 @TimSylvester - 不明白他的問題。試圖弄清楚。 – buschtoens 2011-04-03 19:49:33

0

這是接近你想要什麼

/((?=foobar)foo|foobad)/ 

它是匹配單個組會foo(但只有與它會匹配foobar開始)或foobad。表格(?=...)是一個零寬度預讀斷言。

這不正是你想要的,因爲在比賽中的foobar情況下,僅僅是foo但海事組織能夠有它來搭配foobar的,但分組只有在foobad將匹配同一組富,而不是需要回顧後和AFAIK它的沒有在JavaScript中可用。