1

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

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,这意味着它只是\d在 #2 中被替换。

那么为什么它不会抛出任何异常呢?最后是字符串参数,Pattern.compile()那么它不会检测到非法转义字符吗?有人可以解释为什么会这样吗?

4

4 回答 4

3

字符串文字中的反斜杠字符需要转义(前面有反斜杠)。从命令行传入时,字符串不是字符串文字。编译器抱怨"\d"不是一个有效的转义序列(请参阅字符和字符串文字的转义序列)。

于 2012-09-24T21:36:12.403 回答
1

\字符用作 Java 字符串文字和正则表达式的转义字符。这让很多程序员感到困惑。当您想在 Java 中创建一个字符串来表示具有转义字符的正则表达式时,您需要对 Java 转义字符进行转义。

在命令行中传递字符串时,JVM 会为您处理并简单地创建字符串。

你想要的是这个

Pattern p = Pattern.compile("\\d");
于 2012-09-24T21:44:20.443 回答
1

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

在正则表达式中,是相对于正则表达式而不是Java\d的转义。这意味着为了输入字符串文字,您必须输入字符串。基本上,您必须转义以获得字面值,然后在编译正则表达式时,它会进一步转义要解析为数字。\d"\\d"\\dPattern\d

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

于 2012-09-24T21:47:58.793 回答
0

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

于 2012-09-24T21:36:35.700 回答