私はこの簡単なコードを得ました:
String ip = "1.2.3.4";
String[] ipArray = ip.split(".");
System.out.println(ipArray[1]);
そしてipArray
、ヒットするまでにnullですSystem.out.println
(nullポインター例外をスローします)。
私の質問は、ip の .s ごとに分割するように設定しているにもかかわらず、ipArray が null のままになるのはなぜですか?
私はこの簡単なコードを得ました:
String ip = "1.2.3.4";
String[] ipArray = ip.split(".");
System.out.println(ipArray[1]);
そしてipArray
、ヒットするまでにnullですSystem.out.println
(nullポインター例外をスローします)。
私の質問は、ip の .s ごとに分割するように設定しているにもかかわらず、ipArray が null のままになるのはなぜですか?
使用ip.split("\\.");
して、あなたの問題は解決されます。問題は、String#splitが正規表現を受け取ることです。ドット (.) 記号は正規表現の特殊文字であるため、通常のドットとして解釈するにはエスケープする必要があります。また、バックスラッシュはエスケープ文字であるためです。 Java では、それもエスケープする必要があります。
.
正規表現の特殊文字で、文字列を分割するために使用されます。
これを回避するには、 をエスケープする必要があります.
。残念\.
ながら、\
Java文字列の特殊文字でもあるため、エスケープする必要があります。\\.
私たちの「最終」結果はip.split("\\.");
関連する問題では、プロセス全体を完全に回避できます。標準ライブラリが既に行っていることを行うのは無意味です。
次のことを考慮してください
byte[] ipOctets = InetAddress.getByName(ip).getAddress();
ここでの唯一の問題は、int値が必要な場合は、次のように抽出する必要があることを覚えておくこと&
ですint octet = ipOctets[0] & 0xFF;
Pattern.quote(String)を使用して、文字列全体を引用することもできます。これは文字どおりに解釈されるパターンを返します。特殊文字は特別な意味を持ちません。この場合、これはやり過ぎかもしれませんが、便利な場合もあります。