【问题标题】:java regex illegal escape character error not occurring from command line arguments [duplicate]命令行参数未发生java正则表达式非法转义字符错误[重复]
【发布时间】:2012-09-24 21:33:24
【问题描述】:

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

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() 正在使用的字符串参数,那么它不会检测到非法转义字符吗?有人可以解释一下为什么会这样吗?

【问题讨论】:

  • 试试这个Pattern p = Pattern.compile("\\d");
  • 我知道它有效,这不是我的问题
  • 在 Java 代码中表示 \d 必须使用 \\d 完成,\ 字符在 Java 代码中被视为转义字符。见this question

标签: java regex


【解决方案1】:

字符串文字中的反斜杠字符需要转义(前面有反斜杠)。从命令行传入时,字符串不是字符串文字。编译器报错是因为"\d" 不是有效的转义序列(参见 Escape Sequences for Character and String Literals )。

【讨论】:

  • so jvm 自动将\d 转换为\\d ?
  • 并且即使在命令行上它也不是字符串文字。 SOP 将其显示为\d,因此必须按原样更换。什么时候发生这种转换?
  • @Shades88,它只会创建一个包含"\d"String,就像new String("\\d") 一样。您不要在命令行上转义它,只能在字符串文字中。
  • @Shades88 当\\d 实际上 传递给Pattern.compile 时,更合适的说法是\\d 被正确转换为\d(而不是相反)
【解决方案2】:

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

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

你想要的是这个

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

【讨论】:

  • 即使在命令行上它不是字符串文字。 SOP 将其显示为\d,因此必须按原样更换。 compile 方法也接受一个字符串,所以它和Pattern.compile("\d") 一样好。 \d\\d 的转换何时发生?
  • 我不认为它将它从 \d 转换为 \\d 而是在 Java 代码中 \\d 表示字符序列 \d。
【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-14
      • 1970-01-01
      • 2010-11-25
      • 2011-12-15
      • 2013-07-23
      • 2016-04-30
      • 2015-10-28
      相关资源
      最近更新 更多