IPv6アドレスをPerl正規表現と一致させるにはどうすればよいですか?
質問
そのため、マスクがある場合とない場合があるipv6アドレスを照合する必要があります。残念ながら、ライブラリを使用して文字列を解析することはできません。
マスクビットは十分に簡単です。この場合:
(?:\/\d{1,3})?$/
難しい部分は、ipv6アドレスのさまざまな形式です。 :: beef、beef ::、beef :: beefなどと一致する必要があります。
更新:もうすぐそこにいます。
/^(\:\:([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の正規表現の使用に制限されています。
解決
これには、Regexp :: Commonデモンストレーションへのパッチが含まれています完全で正確なテスト済みのIPv6正規表現。 IPv6文法をそのまま翻訳したものです。 Regexp :: IPv6 も正確です。
さらに重要なことは、テストスイートが含まれていることです。正規表現を使用して実行すると、まだ道を進んでいることがわかります。 19回中10回逃した。 12個の誤検出のうち1個。 IPv6には多くの特別な略記が含まれており、微妙に間違えやすくなっています。
IPv6アドレスに入力される内容を読むのに最適な場所は、 RFC 3986 セクションです3.2.2。
他のヒント
ライブラリだけを使用できないのはどういう意味ですか?モジュールはどうですか? Regexp :: IPv6
は必要なものを提供します。
私はIPv6の専門家ではありませんが、提案したような非常に単純な正規表現では、IPv6アドレスの照合(検証はもちろん)が容易ではないことを伝えるときに、私を信頼してください。例に名前を付けるために、アドレスとポートを組み合わせるための多くの略記法とさまざまな規則があります。そのような略記法の1つは、0:0:0:0:0:0:0:1を:: 1として記述できることですが、他にもあります。ドイツ語を読む場合、 Steffen Ullrichの講演のスライドをご覧になることをお勧めします。第11回ドイツ語Perlワークショップで。
ライブラリを使用できないと言いますが、ライブラリの複雑さ全体を再発明する場合は、プロジェクトにそのままインポートすることもできます。
これはほとんど機能します...
^([0-9a-fA-F]{0,4}|0)(\:([0-9a-fA-F]{0,4}|0)){7}$
短所: ::
ケースが正しく処理されない
perlチェックで文字列がIPv6アドレスかどうかを確認する必要がある場合は、これを試してください:
if (/(([\da-f]{0,4}:{0,2}){1,8})/i) { print("$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
見つけた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://en.wikipedia.org/wiki/IPv6
ここで使用されている検証ツール: