5

したがって、マスクがある場合とない場合がある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の正規表現の使用に制限されています。

4

8 に答える 8

13

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

さらに重要なことは、テスト スイートが含まれていることです。あなたの正規表現でそれを実行すると、あなたはまだ道を外れていることがわかります。19人中10人が欠場。12 回の誤検知のうち 1 回。IPv6 には多くの特別な略記が含まれているため、微妙に間違えやすくなっています。

IPv6 アドレスに何が入るかを調べるのに最適な場所は、RFC 3986セクション 3.2.2 です。

于 2009-11-28T01:05:46.240 に答える
10

ライブラリだけを使用できないとはどういう意味ですか? モジュールはどうですか?Regexp::IPv6必要なものを与えてくれます。

于 2009-11-26T11:02:38.537 に答える
5

私はIPv6の専門家ではありませんが、あなたが提案するような非常に単純な正規表現を使用してIPv6アドレスを照合する(検証することは言うまでもなく)ことは簡単ではないことをあなたに伝えたとき、私を信じてください. 例を挙げるだけでも、アドレスとポートを組み合わせるには、多くの略記とさまざまな規則があります。そのような省略表現の 1 つは、0:0:0:0:0:0:0:1 を ::1 のように書くことができるというものですが、それ以上のものがあります。ドイツ語を読めるなら、第 11 回ドイツ語 Perl ワークショップでのSteffen Ullrich の講演のスライドを見ることをお勧めします。

ライブラリを使用できないと言っていますが、ライブラリの複雑さ全体を再発明する場合は、プロジェクトに逐語的にインポートすることもできます。

于 2009-11-26T10:18:16.430 に答える
2

これは主に機能します...

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

短所:::同様のケースが正しく処理されない

于 2011-04-20T13:02:55.173 に答える
1

これを試して:

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

正規表現ライブラリから:IPv6アドレス

また、これを読む必要があります:IPv6アドレスの正規表現

于 2009-11-26T10:01:59.877 に答える
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/

于 2012-01-22T09:42:48.167 に答える
1

文字列が IPv6 アドレスであるかどうかを perl で確認する必要がある場合は、次のようにしてみてください。

if (/(([\da-f]{0,4}:{0,2}){1,8})/i) { print("$1") };
于 2011-04-04T06:52:13.033 に答える