为什么在Java中使用split()
的工作方式有所不同?
我想分割一个版本字符串,例如:1.2.3.4但是,如果我这样做:将得到一个空数组,如果我使用split("\\.")
,它将按我的预期工作:
String version1 = "1.2.3.4.5";
String version2 = "1.2.3.4.5.6";
String[] v1Arr = version1.split(".");
String[] v2Arr = version2.split("\\.");
System.out.println(Arrays.toString(v1Arr)); // [] why?
System.out.println(Arrays.toString(v2Arr)); // [1, 2, 3, 4, 5, 6]
String version1 = "1-2-3-4-5";
String version2 = "1-2-3-4-5-6";
String[] v1Arr = version1.split("-");
String[] v2Arr = version2.split("\\-");
System.out.println(Arrays.toString(v1Arr)); // [1, 2, 3, 4, 5]
System.out.println(Arrays.toString(v2Arr)); // [1, 2, 3, 4, 5, 6]
如果我更改“。” “-”都按预期工作,为什么会发生这种情况?预先谢谢你!
答案 0 :(得分:6)
.
是正则表达式中的特殊模式标记。它与任何一个字符匹配。当您分割每个可能的字符时,您会得到一个空数组(因为没有剩余的东西)。相反,当您使用.
转义\\.
时,令牌将呈现为文字(并且仅与文字.
匹配)。
答案 1 :(得分:2)
\称为转义字符和。点被解释为转义字符,因此您不能直接使用点来分割字符串
这就是为什么必须将\用作点的转义字符,以字符串中的点表示
答案 2 :(得分:2)
作为@Elliott Frisch答案的替代方法,您还可以拆分正则表达式字符类中包含的一个或多个字符。考虑以下代码片段:
String version = "1.2.3.4.5.6";
String[] parts = version.split("[.]");
方括号告诉正则表达式引擎将内部内容视为文字字符,在这种情况下为文字点。当尝试分割几个字符(其中许多也许是元字符)时,这种方法可能会更加有用。使用括号表示法,我们不必担心特殊的转义语法。