为什么在这个正则表达式中没有被解释为反斜杠?

时间:2010-09-04 00:17:50

标签: java regex

我正在学习使用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]);    
            }



   }
}

3 个答案:

答案 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上的格式化需要“四倍反斜杠期”,这有点奇怪。