26

我得到了这个简单的代码:

String ip = "1.2.3.4";
String[] ipArray = ip.split(".");
System.out.println(ipArray[1]);

并且ipArray在它命中时为空System.out.println(抛出空指针异常)。

我的问题是为什么即使我将 ipArray 设置为在每个 ip 的 .s 上拆分,ipArray 仍保持为空?

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 值,你必须用&like提取它int octet = ipOctets[0] & 0xFF;

于 2012-07-12T17:25:58.197 回答
5

Pattern.quote(String)也可以用来引用整个字符串。这将返回一个将按字面解释的模式,特殊字符没有特殊含义。在这种情况下,这可能有点矫枉过正,但有时它可能很有用。

于 2013-09-06T18:13:22.617 回答
0

我们也可以使用 split ("[.]")

String s = "abcd.jpg";
String[] strarry = s.split ("[.]");

星[0]=abcd,星[1]=jpg

于 2021-09-27T11:14:11.080 回答