IPv4 に一致する String#matches(String) に渡す文字列と、IPv6 に一致する別の文字列を探します。
6 に答える
public static final String IPV4_REGEX = "\\A(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}\\z";
public static final String IPV6_HEX4DECCOMPRESSED_REGEX = "\\A((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?) ::((?:[0-9A-Fa-f]{1,4}:)*)(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}\\z";
public static final String IPV6_6HEX4DEC_REGEX = "\\A((?:[0-9A-Fa-f]{1,4}:){6,6})(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}\\z";
public static final String IPV6_HEXCOMPRESSED_REGEX = "\\A((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)::((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)\\z";
public static final String IPV6_REGEX = "\\A(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}\\z";
これらはどこかのブログから入手しました。正規表現を得意とする人なら、すべての IPv6 アドレス タイプに対して単一の正規表現を考え出すことができるはずです。実際、IPv4 と IPv6 の両方に一致する単一の正規表現を使用できると思います。
IPを処理するためのもう1つの優れたオプションは、JavaのクラスInet4AddressおよびInet6Addressを使用することです。これらは、IPアドレスの有効性を判断するなど、さまざまな方法で役立ちます。
私はこれが質問に直接答えないことを知っていますが、言及する価値があると思っただけです。
IPv4 アドレスに一致する正規表現は次のとおりです。
\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b
Java で文字列リテラルとして指定する場合は、バックスラッシュをエスケープする必要があります。
"\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b"
正規表現では、IPv4部分で先行ゼロを使用できます。
一部のUnixおよびMacディストリビューションは、これらのセグメントを8進数に変換します。
25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d
IPv4セグメントとして使用することをお勧めします。
ipv4 が埋め込まれたアドレスと圧縮されたアドレスを考慮すると、ipv6 の正規表現は非常に扱いにくくなります。
オープンソースの IPAddress Java ライブラリは、IPv6 および IPv4 のすべての標準表現を検証し、プレフィックス長 (およびそのような検証) もサポートします。免責事項: 私はそのライブラリのプロジェクト マネージャーです。
コード例:
try {
IPAddressString str = new IPAddressString("::1");
IPAddress addr = str.toAddress();
} catch(AddressStringException e) {
//e.getMessage has validation error
}