26

私はこの簡単なコードを得ました:

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 のままになるのはなぜですか?

4

4 に答える 4

50

使用ip.split("\\.");して、あなたの問題は解決されます。問題は、String#splitが正規表現を受け取ることです。ドット (.) 記号は正規表現の特殊文字であるため、通常のドットとして解釈するにはエスケープする必要があります。また、バックスラッシュはエスケープ文字であるためです。 Java では、それもエスケープする必要があります。

于 2012-07-12T17:24:38.163 に答える
42

.正規表現の特殊文字で、文字列を分割するために使用されます。

これを回避するには、 をエスケープする必要があります.。残念\.ながら、\Java文字列の特殊文字でもあるため、エスケープする必要があります。\\.

私たちの「最終」結果はip.split("\\.");

関連する問題では、プロセス全体を完全に回避できます。標準ライブラリが既に行っていることを行うのは無意味です。

次のことを考慮してください

byte[] ipOctets = InetAddress.getByName(ip).getAddress();

ここでの唯一の問題は、int値が必要な場合は、次のように抽出する必要があることを覚えておくこと&ですint octet = ipOctets[0] & 0xFF;

于 2012-07-12T17:25:58.197 に答える
5

Pattern.quote(String)を使用して、文字列全体を引用することもできます。これは文字どおりに解釈されるパターンを返します。特殊文字は特別な意味を持ちません。この場合、これはやり過ぎかもしれませんが、便利な場合もあります。

于 2013-09-06T18:13:22.617 に答える