2012-10-03 37 views
2

jQuery datatables庫文件中有一個構造正則表達式的方法。誰能告訴我這是什麼下面的正則表達式的意思是 -瞭解正則表達式

^(?=.*?il)(?=.*?oh).*$ 
+1

我建議你花幾分鐘閱讀[標籤信息](http://stackoverflow.com/tags/regex/info)。 –

+0

[您應該查看關於JavaScript正則表達式的MDN](https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Regular_Expressions)。 – zzzzBov

回答

9
^ 

匹配輸入的乞求。這匹配一個位置,而不是一個字符(將其視爲字符之間的空格)。

(?=) 

這被稱爲超前測量。再次,這匹配一個位置。它匹配的位置是當前位置前面的文本等於給定文本的位置,但「指針」不會向前移動。想想它就像在前面偷看而不會彈出。

.*?il 

匹配任何數字的任何字符(默認情況下除了換行符),後跟字符「il」。

.*?oh 

和上面一樣,除了字符「哦」。

$ 

匹配輸入的結束。

基本上,這個正則表達式正在檢查輸入字符串是否包含字符「il」和「哦」。

比喻:
想一想這樣。你有一個人的陣容,你加強到第一人(^)。然後,你一次向前看一個人,直到你找到一個戴着紅帽子的人,緊接着是一頂黃色的帽子。 ((?=.*?il))。你的眼睛飛回到陣容中的第一個人,然後重複搜索,除了這次你正在尋找一個戴紫色帽子的人,緊接着是一頂綠色帽子((?=.*?oh))。最後,你走過所有的人,把每個人從陣容中拉出來,直到你走到隊尾(.*$)。如果在任何時候你找不到你要找的東西,你都會轉身離開房間(相當於返回錯誤)。否則,在陣容結束後,你會大喊「糖果!」 (相當於返回true)。

興趣點的:
的向前看符號使用什麼是所謂的「非貪婪」量詞(*?)。這基本上是說「儘可能多的匹配,但不要多」。一個貪婪的量詞(*)說「儘可能多的匹配」。如果已經使用了貪婪的量詞,這相當於將你的眼睛移動到陣容的後面,然後向前掃描,在第一場比賽中停止(如果從前面數起來,這將是陣容中的最後一場)。

如果您要刪除輸入錨的開始(^),那麼這個表達式將容易遭受災難性的回溯。由於前瞻是基於位置匹配的,如果它不匹配,那麼它會嘗試前進一個字符並再次嘗試。 ^將預覽鎖定在輸入中的第一個位置。如果他們無法從那個位置找到他們想要的東西,那麼他們就會失敗。

.*$部分是絨毛。你可以在不影響表達式的情況下刪除它(編輯:嗯,實際上,如果你只是測試輸入,那麼就是這樣。你使用的是匹配結果,那麼你需要.*來產生一個非零長度字符串)。但是,如果您要確保輸入的長度是一定的,則可以使用.{5,10}$代替。這就好像在整個陣容中走動一樣,數着你拉出的人數,只喊「糖果!」如果您發現至少5人但不超過10人(備選方案:{5,} - 至少5個字符,沒有上限; {,10} - 不超過10個字符且沒有下限)。鑑於你正在尋找字符「il」和「哦」,已經有一個隱含的要求,即輸入至少4個字符(沒有上限)。

+1

不要忘記說明'$' – zzzzBov

+0

如果我想知道輸入字符串是否包含「il」或「哦」,該怎麼辦。上面的正則表達式看起來如何? – SKR

+2

'^(?=。*?(oh | il))。* $' – JDB

1

您可以使用http://gskinner.com/RegExr/幫助分析最正則表達式和測試他們對輸入數據。在互聯網上有這樣的一些工具。這個需要Flash。 (這不是賣點,只是信息。)

請注意,我提供的網址在正則表達式的標記維基頁面中提及。

+0

總是很好的檢查維基。 :)但令人驚訝的是,它沒有[regular-expressions.info](http://www.regular-expressions.info/reference.html)。 (或者我可能錯過了) –