我正在学习使用Java的Pattern和Matcher,这是我书中的示例代码片段。它可以像作者描述的那样工作,但我没有得到的是为什么\\.
最终成为一个点而不是一个反斜杠(\\部分)和一个点(。部分)。编译器是否从左到右不读?
import java.util.regex.*;
public class SplitTest {
public static void main(String[] args) {
String input= "www.cs.cornell.edu";
Pattern p = Pattern.compile("\\.");
String pieces[] = p.split(input);
for (int i=0; i<pieces.length; i++){
System.out.println(pieces[i]);
}
}
}
答案 0 :(得分:6)
在解析字符串文字时会被解释一次,而在正则表达式编译器中会被解释一次。
"\\."
- &gt; "\."
- 字符串文字
"\."
- &gt;文字.
- 正则表达式编译器
答案 1 :(得分:4)
您必须双重转义字符串文字。
"\\\\."
因为Java将字符串文字"\\."
解释为\.
,这不是您所期望的。
试试这个:System.out.println("\\.")
,你看到的就是你在正则表达式中获得的东西。
编辑:您的输入字符串为"www.cs.cornell.edu"
。你知道你在做什么吗?也许你试图用点(\.
)进行拆分,当你输入时,它的Java文字为"\\."
。
也许您正在尝试匹配BACKSLASH然后匹配DOT,这意味着它的正则表达式为\\\.
,其Java文字为"\\\\\\."
答案 2 :(得分:0)
您的代码可以简化一下,如下:
public class SplitTest {
public static void main(String[] args) {
String input = "www.cs.cornell.edu";
String[] pieces = input.split("\\.");
for (String piece : pieces) {
System.out.println(piece);
}
}
}
在这种情况下,“双反斜杠期”的工作原理与预期的一样,但是stackoverflow上的格式化需要“四倍反斜杠期”,这有点奇怪。