2009-11-26 139 views
5

所以我需要匹配一個ipv6地址,它可能有也可能沒有掩碼。不幸的是,我不能僅僅使用庫來解析字符串。如何將IPv6地址與Perl正則表達式匹配?

屏蔽位是很容易的,在這種情況下:

(?:\/\d{1,3})?$/ 

硬的部分是不同的格式的IPv6地址的。它需要匹配::牛肉,牛肉::,牛肉::牛肉等

更新:我幾乎沒有..

/^(\:\:([a-f0-9]{1,4}\:){0,6}?[a-f0-9]{0,4}|[a-f0-9]{1,4}(\:[a-f0-9]{1,4}){0,6}?\:\:|[a-f0-9]{1,4}(\:[a-f0-9]{1,4}){1,6}?\:\:([a-f0-9]{1,4}\:){1,6}?[a-f0-9]{1,4})(\/\d{1,3})?$/i 

我,在這種情況下只能使用Perl的正則表達式。

+1

這是功課嗎?或者爲什麼你不能使用一個庫,以及是什麼讓你說你被限制爲「perl的正則表達式」? – innaM 2009-11-26 12:44:11

+2

我使用的語言是perl。允許使用其他庫所需的更改將需要更多的工作。定義作業?我在家,我正在工作。這是我正在研究的項目之一 - 如果你的意思是教育目的,那麼不。 – imnotneo 2009-11-26 13:14:11

+6

「允許使用其他庫所需的更改將會更有效。」 - 我對此表示懷疑。至少從長遠來看並非如此。一般來說,不使用CPAN模塊的Perl只是語言的一半。拒絕使用簡單的純Perl模塊,然後詢問別人解決以前解決的問題似乎......效率低下。 – tsee 2009-11-26 13:41:59

回答

13

This包含Regexp :: Common修補程序,演示完整,準確,經過測試的IPv6正則表達式。它直接翻譯了IPv6語法。 Regexp::IPv6也是準確的。

更重要的是,它包含一個測試套件。用你的正則表達式運行它表明你仍然是一個方法。 19人中有10人錯過了。 12個誤報中有1個。 IPv6包含許多特殊的簡寫,使得它很容易發生微妙的錯誤。

閱讀IPv6地址內容的最佳位置是RFC 3986,第3.2.2節。

+0

任何人都知道這是否有Python版本? – jcollie 2011-06-10 02:04:59

+0

@jcollie那些正則表達式沒有使用任何有趣的Perl特性。他們應該是對Python的死記硬背的翻譯。 – Schwern 2011-06-10 18:50:34

5

我不是一個IPv6專家,但請相信我,當我告訴你,匹配(更別提驗證了)使用一個非常簡單的正則表達式(如你所建議的那個),IPv6地址並不容易。有很多簡短的說法和各種各樣的將地址與端口相結合的約定,只是舉個例子。一種這樣的簡寫就是你可以寫0:0:0:0:0:0:0:1爲1,但還有更多。如果您閱讀德語,我會建議您在第11屆德語Perl Workshop上查看Steffen Ullrich's talk的幻燈片。

你說你不能使用一個庫,但是如果你要重塑庫的整個複雜性,那麼你也可以將它逐字地導入到你的項目中。

10

你是什麼意思,你不能只使用一個圖書館?模塊如何? Regexp::IPv6會給你你需要的東西。

1

如果您在Perl檢查需要一個字符串是IPv6地址,你可以試試這個:

if (/(([\da-f]{0,4}:{0,2}){1,8})/i) { print("$1") }; 
2

這主要作品...

^([0-9a-fA-F]{0,4}|0)(\:([0-9a-fA-F]{0,4}|0)){7}$ 

缺點:::如不正確處理案件

0

這裏是一個工作了我已經IPv6的所有實例設法找到:

/^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/ 

確保它是使用前的一行。 它已經在這裏找到:

https://community.helpsystems.com/forums/intermapper/miscellaneous-topics/5acc4fcf-fa83-e511-80cf-0050568460e4

驗證從問題頁面,社區頁面和維基百科網站的所有示例從這裏:

https://en.wikipedia.org/wiki/IPv6

的驗證工具使用從這裏開始的:

https://regex101.com/