2011-04-27 139 views
4

我在學習re模塊二郎神的,我只是想在一個URL匹配的IP地址:IP地址二郎

Url = "http://192.168.1.241/mod/fun?arg", 
re:run(Url, "(\\d{1,3}\\.){3}\\d{1,3}", [{capture, all, list}]). 

但它返回{match,["192.168.1.168","1."]}給我。爲什麼"1."在退貨清單中?

回答

5

您已經爲ValueSpec指定了「all」,這意味着您將獲得所有匹配的子組。在這種情況下,包括「1.」。您可以只指定「第一個」,而不是「全部」,您將獲得的是第一個匹配組(完整的IP)。

你應該做的是這樣的:

Url = "http://192.168.1.241/mod/fun?arg", 
re:run(Url, "(\\d{1,3}\\.){3}\\d{1,3}", [{capture, first, list}]). 

這將返回:

{match,["192.168.1.241"]} 

更多信息here

編輯:萬一你錯過,這裏是在文檔(這說明它比我好多了:-))的相關部分:

指定哪些捕獲(子)模式是被退回。 ValueSpec既可以是描述預定義返回值集合的原子,也可以是包含要返回的索引或特定子模式名稱的列表。

子模式的預定義集:

所有

拍攝的所有子模式,包括完全匹配的字符串。這是默認設置。

第一

只有第一捕獲子模式,這始終是被檢體的完整匹配的部分。所有顯式捕獲的子模式都被丟棄。

all_but_first

除了第一個匹配的子模式,即所有明確捕獲子模式,但不是主體字符串的完整匹配的部分。如果正則表達式作爲一個整體與主體的大部分相匹配,但是您感興趣的部分位於明確捕獲的子模式中,這非常有用。如果返回類型是列表或二進制,則不返回您不感興趣的子模式是優化的好方法。

不要返回匹配的子模式在所有,得到單原子匹配爲成功匹配代替{匹配,列表()}當回報函數的返回值。指定一個空列表給出了相同的行爲。

4

嘗試:

((?:\\d{1,3}\\.){3}\\d{1,3}) 

您當前的支架只有一個IP地址的一部分匹配。如果你設置忽略它並匹配整個正則表達式,你會得到正確的結果。

+0

您的工作也是如此。但是在你的表達中「?:」的含義是什麼? – lujb 2011-04-27 08:40:59

+0

它忽略結果集中的組。 – hsz 2011-04-27 08:47:11

+0

許多人認爲你。 – lujb 2011-04-28 06:39:41