2015-06-11 62 views
0

據對堆棧溢出以下answer:(?= *巴茲)正則表達式與運算符不工作

(?= * FOO)

這是說的正則表達式的FOO必須出現任何地方和巴斯必須出現在任何地方,不一定按照這種順序並可能重疊。

這個正則表達式應該與那些話巴茲

Where foo have baz all my life 

然而,這是行不通的。也不在regexr也不在regexpal.com

+0

類似於:https://regex101.com/r/rS8sK6/1? –

+0

@ʰᵈˑ:優秀!你能向我解釋一下表達嗎? –

回答

1

你需要創建一個圍繞foobaz捕獲組,因爲環視不是捕獲組,但斷言。

該向前本身不是捕獲組。它不包括在編號反向引用的計數中。 如果要將正則表達式的匹配存儲在預見範圍內,則必須在預見範圍內的正則表達式周圍捕獲括號,如下所示:(?=(regex))。另一種方式將無法工作,因爲在捕獲組存儲其匹配時,前瞻已經放棄了正則表達式匹配。

http://www.regular-expressions.info/lookaround.html

讓你的正則表達式:

(?=.+?(foo))(?=.+?(baz)) 

注先行內的捕獲組。

https://regex101.com/r/rS8sK6/1

+0

明白了。但是,如果你從foo開始;它不起作用。 –

+0

這是因爲積極的向前看。它至少需要一個字符(因爲我把量詞變成了'+?' - *我的不好*)。如果你在'.'之後改變'+?',量化'*',那麼它會:https://regex101.com/r/rS8sK6/2 –

+0

謝謝。現在所有的作品。任何想法爲什麼http://regexpal.com/不適用於這個表達式? –

1

變形只是斷言,不會匹配任何單個字符。

(?=.*foo)(?=.*baz) 

聲稱,在比賽將要happend行必須包含foobaz字符串。而且我建議你使用錨以及上面的外觀。

^(?=.*foo)(?=.*baz) 

這將存在於行首的邊界。

上述正則表達式會有幫助嗎?

當您要打印字符串foobaz出現的整行時,這很有用。

在JS,你可以寫

/^(?=.*foo)(?=.*baz)/m.test(string); 
0

如果只有兩個你正在尋找的字符串,你可以這樣做:

(XXX * YYY)|(YYY * XXX)

它將搜索XXX和YYY在兩個訂單的同一行中。

也許效率不高,但它很簡單,有效。