为什么此 Java 正则表达式会导致“非法转义字符”错误?

2022-08-31 23:50:52

我正在使用正则表达式尽可能地解决上一个问题。我的模式是

"\d{4}\w{3}(0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9]){2}"

根据 NetBeans 的说法,我有两个非法转义字符。我猜它与\d和\w有关,但这些在Java中都是有效的。也许我对Java正则表达式的语法是关闭的...

涉及的整行代码是:

userTimestampField = new FormattedTextField(
  new RegexFormatter(
    "\d{4}\w{3}(0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9]){2}"
));

答案 1

假设此正则表达式位于 Java 文本中,您需要转义和标记的反斜杠:String\d\w

"\\d{4}\\w{3}(0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9]){2}"

坦率地说,当你想要匹配反斜杠时,这会得到更多的疯狂

public static void main(String[] args) {        
    Pattern p = Pattern.compile("\\\\\\\\"); //ERM, YEP: 8 OF THEM
    String s = "\\\\";
    Matcher m = p.matcher(s);
    System.out.println(s);
    System.out.println(m.matches());
}

\\ //JUST TO MATCH TWO SLASHES :(
true

答案 2

你试过吗?"\\d""\\w"

-编辑-哈哈,我发布了正确的答案并进行了投票,然后我注意到stackoverflow逃脱了反斜杠,所以我的答案看起来是错误的:)