4

ipv4とipv6の両方のInetSocketAddress(つまり、IPアドレス+ポート番号)のテスト済み正規表現を探しています。ホスト名の検証には興味がありません。

2つの正規表現(1つはipv4用、もう1つはipv6用)または1つの組み合わせ正規表現にすることができます。

誰かが共有するものはありますか?

編集

ip4形式の情報については、ここを参照してください。ipv6形式の情報については、ここを参照してください。次に、ポート番号が「:」で追加されます。

編集2 文字列表現を作成するには、次のように進めます。

byte[] tmp = { 10, 1, 0, 0 };
InetSocketAddress isa = new InetSocketAddress(
        InetAddress.getByAddress(tmp), 443);

これは次を返します:

/10.1.0.0:443
4

3 に答える 3

3

.toString()これを行うためにの正規表現を使用しようとするのは、InetSocketAddressそれほど良い考えではないかもしれません。(上記の質問に対するコメントを参照してください)

考えられる代替案の1つは、URLまたはURIを使用して、アドレスを文字列形式で出力することです。これは、はるかに標準化されています。


**編集:**

一方、正規表現で自分を拷問したい場合は...;-)

IPv4:

      Pattern: .*/([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+):([0-9]+)
Java constant: ".*/([0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+):([0-9]+)"

ドットクワッド形式のアドレスのみを処理します。無効なアドレスを検出しません。

IPv6:

      Pattern: .*/([0-9a-f]+:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+(%[a-zA-Z0-9]+)?):([0-9]+)
Java constant: ".*/([0-9a-f]+:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+(%[a-zA-Z0-9]+)?):([0-9]+)"

8つの16ビットセクションすべてでIPv6アドレスを処理します。(これが機能する唯一の理由は、JavaのInet6Address実装が非標準の方法でアドレスを出力するように見えるためです。おそらく、ポート番号を追加でき、あいまいさはありません)無効なIPv6アドレスを検出しません。小文字の16進文字のみを処理します。ゾーン/スコープID(存在する場合)を大文字または小文字および/または数字で処理します。

見つけた便利なアプレットでテストしました。

そして、記録のために、私はまだそれが悪い考えだと思います。;-)すべてのJavaプラットフォームがこの方法でアドレスを出力するかどうかはわかりません。

于 2011-04-21T20:39:40.150 に答える
2

正規表現ライブラリを見ることができます

于 2011-04-21T17:33:12.910 に答える
1

悪いアイデア。RFC 5952形式のIPv6アドレスは正規言語ではないため、正規表現でそれらを解析することは失敗への道です。POSIXinet_pton関数などの適切な解析関数を使用してください。Javaはどこかに1つあるはずです。誰が知っているか、RFC 5952のセクション5に従って、埋め込まれたIPv4サブフィールドでIPv6アドレスを処理するのに十分賢いかもしれません。

真剣に...これには正規表現を使用しないでください。

于 2011-04-22T16:19:39.470 に答える