2009-11-26 9 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

+2

私が使っている言語はperlです。他のライブラリの使用を許可するために必要な変更は、より多くの作業になります。宿題を定義する?私は家にいて、働いています。それは私が取り組んでいるプロジェクトの1つです。あなたが教育目的のために意味するならば、そうではありません。 – imnotneo

+6

"他のライブラリの使用を許可するために必要な変更は、もっと有効です。" - 疑わしい。少なくとも長期的にはそうではありません。一般にCPANのモジュールを使用しないPerlは言語の半分に過ぎません。シンプルな純粋なPerlモジュールを使用することを拒否して、以前に解決された問題の解決策を他の人に求めるのは非効率的なようです。 – tsee

答えて

13

Thisには、Regexp :: Commonへのパッチが含まれています。完全で正確でテスト済みのIPv6正規表現です。それはIPv6文法のまっすぐな翻訳です。 Regexp::IPv6も正確です。

さらに重要なのは、テストスイートが含まれていることです。あなたの正規表現でそれを実行すると、あなたはまだ道のりであることが示されます。 19のうち10が欠けていた。 12の誤認のうち1つ。 IPv6には特別な省略表現がたくさん含まれており、微妙に間違ってしまうのは非常に簡単です。

IPv6アドレスに入る内容を読むには、RFC 3986セクション3.2.2が最適です。

+0

これはPythonのバージョンがあれば誰でも知っていますか? – jcollie

+0

@jcollieこれらの正規表現は面白いPerlの機能を使用していません。それらはPythonへの翻訳でなければなりません。 – Schwern

5

を私は、IPv6の専門家ではないんだけど、私はあなたを教えたときに私を信頼することをしてください(マッチングあなただけが提案するような非常に単純な正規表現では、IPv6アドレスは簡単ではありません。たとえば、名前を付けるために、アドレスとポートを組み合わせるための多くの短縮形やさまざまな規則があります。そのような省略形の1つは、0:0:0:0:0:0:0:1を:: 1と書くことができるということです。ドイツ語を読んだら、第11回ドイツのPerlワークショップでSteffen Ullrich's talkのスライドを見ることをお勧めします。

ライブラリを使用することはできませんが、ライブラリ全体の複雑さを再考する場合は、そのままプロジェクトにそのままインポートすることもできます。

10

ライブラリを使用できないということを意味しますか?モジュールについてはどうですか? Regexp::IPv6が必要なものを提供します。

1

文字列がIPv6である場合は、perlのチェックに必要な場合は、この試すことができます対処:これは主に働く

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}$ 

短所:ない正しく処理例のような::

1

してみますから

/^(((?=(?>.*?(::))(?!.+\3)))\3?|([\dA-F]{1,4}(\3|:(?!$)|$)|\2))(?4){5}((?4){2}|((2[0-4]|1\d|[1-9])?\d|25[0-5])(\.(?7)){3})\z/ai 

:ここ http://home.deds.nl/~aeron/regex/

0

は1つが、私はしました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*$/ 

使用する前に1行になっていることを確認してください。それがここで発見されています :

ここからの質問ページ、コミュニティページやWikipediaのサイトからのすべての例に検証

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

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

使用されている検証のためのツールここからのもの:

https://regex101.com/

関連する問題