2011-02-08 60 views
1

我在這個網站上發現了一個非常漂亮的URL正則表達式匹配器:http://daringfireball.net/2010/07/improved_regex_for_matching_urls。它聲明它可以自由使用,並且它與跨語言兼容(包括Javascript)。首先,我必須逃避一些斜線才能編譯它。當我這樣做時,它在Rubular.com上正常工作(我通常測試正則表達式),每個匹配有5個字段的奇怪副作用:1是url,另外4是空的。當我把這個在JS中,我得到錯誤「無效組」。我使用Node.js,如果這有什麼區別,但我希望我能理解錯誤。我想減少不必要的空白匹配字段,但我甚至不知道從哪裏開始診斷這個野獸。這是我在轉義之後所得到的:幫助製作「通用」正則表達式Javascript兼容

(?xi)\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»「」‘’])) 

回答

3

實際上,你也不需要第一個捕獲組;這種情況與整場比賽相同,並且可以通過$&訪問。可以通過添加?:改變所有的捕獲組非拍攝的開口後的括號:

/\b(?:(?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\((?:[^\s()<>]+|(\(?:[^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\(?:[^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»「」‘’]))/i 

即「無效基」錯誤是由於內聯改性劑(即,(?xi))其中,因爲@kirilloid觀察在JavaScript中不受支持。 Jon Gruber(正則表達式的作者)誤解了這個,因爲他是關於JS支持自由間距模式的。

只是FYI,你必須避開斜槓的原因是因爲你使用的是正則表達式,其中最常見的形式是使用正斜槓作爲正則表達式分隔符。換句話說,它是語言(Ruby或JavaScript),它要求您轉義該特定字符,而不是正則表達式。有些語言讓你選擇不同的正則表達式分隔符,而其他語言根本不支持正則表達式文字。

但這些都是語言問題,而不是正則表達式問題;正則表達式本身似乎像廣告一樣工作。

2

參見,你複製它錯了。

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

  • 否模式修飾符來設置匹配正則表達式內的選項。
  • 沒有正則表達式評論

I.e. (?xi)在開始時是毫無用處的。
X是無用的在所有的壓實的RegExp
可以用標誌
所有這些結果在被替換:

/\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»「」‘’]))/i 

測試和谷歌瀏覽器的工作=>應Node.js的工作