从命令行参数不发生java正则表达式非法转义字符错误

时间:2012-09-24 21:33:25

标签: java regex

这个简单的正则表达式程序

import java.util.regex.*;
class Regex {
    public static void main(String [] args) {
        System.out.println(args[0]); // #1
        Pattern p = Pattern.compile(args[0]); // #2
        Matcher m = p.matcher(args[1]);
        boolean b = false;
        while(b = m.find()) {
            System.out.println(m.start()+" "+m.group());
        }
    }
}
java regex "\d" "sfdd1"调用的

编译并运行正常。

但如果#1被Pattern p = Pattern.compile("\d");替换,则会出现编译错误,说明非法转义字符。在#1中,我也尝试打印命令行参数中指定的模式。它会打印\d,这意味着它会被#2中的\d取代。

那么为什么不抛出任何异常呢?最后它是Pattern.compile()正在采用的字符串参数,它不会检测到非法转义字符吗?有人可以解释一下这种行为的原因吗?

4 个答案:

答案 0 :(得分:3)

字符串文字中的反斜杠字符需要进行转义(以反斜杠开头)。从命令行传入时,字符串不是字符串文字。编译器抱怨,因为"\d"不是有效的转义序列(请参阅 Escape Sequences for Character and String Literals )。

答案 1 :(得分:1)

\字符用作Java字符串文字和正则表达式的转义字符。这让许多程序员感到困惑。如果要在Java中创建String以表示具有转义字符的正则表达式,则需要转义Java转义字符。

在命令行中传入字符串时,JVM会为您处理此问题,并只创建字符串。

你想要的是这个

Pattern p = Pattern.compile("\\d");

答案 2 :(得分:1)

Java中的反斜杠\导致字符串中的转义。例如,字符串"\t"会在java中生成制表符。这也是"\n"生成换行符的原因。

在正则表达式中,\d是与正则表达式相关的转义不是 Java 。这意味着为了在字符串文字中获取\d,您必须在字符串中键入"\\d"。基本上,您必须转义\以获取字面值\d,然后当Pattern编译正则表达式时,它进一步转义\d以解析为数字

这可能令人困惑,但长话短说,你不应该在正则表达式的字符串文字中只有一个\,因为即使字符串文字"\\n"也能正确解析。

答案 3 :(得分:0)

我不完全确定我是否理解了这个问题,但似乎你的问题是你将“\ d”视为Java转义字符,它不存在。要将其视为正则表达式转义字符,请使用“\ d”来转义Java转义。