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

53
我正在尽力使用正则表达式完成一个先前问题的解决方案。我的模式是:

"\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}"
));

这个模式在Java中绝对是合法的,在Eclipse中可以工作。抱歉我没有使用NetBeans。 - Christopher Klewes
有趣。我将整行代码添加到我的问题中,然后尝试构建,即使出现错误...让我们看看会发生什么。 - Thomas Owens
4
在字符串中使用时,请考虑使用\d和\w转义\d和\w。 - Christopher Klewes
7个回答

94
假设这个正则表达式在Java的字符串字面量中,你需要转义你的 \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

15

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

-编辑- 哈哈,我已经发布了正确答案,结果被点踩,然后我才发现stackoverflow转义反斜杠,所以我的答案看起来是错误的 :)


4
我认为你之所以被踩是因为没有很好地利用SO的代码格式功能。 ;) - Alan Moore

8
以下是什么意思:\\d{4}\\w{3}(0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9]){2}

这样可以解决错误……让我们看看它作为正则表达式是否真正有效。 - Thomas Owens
2
看起来它正在工作。+1。然而,我接受了butterchicken的答案,因为它更深入。不过还是谢谢你的帮助。 - Thomas Owens

3

你尝试过这个吗?

\\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中并不是特殊字符。

基本上,我正在开发一个正则表达式https://regex101.com/,然后将其复制粘贴到Java中。

最终我意识到,由于Java将正则表达式作为字符串字面量处理,因此应该转义的只有Java中的特殊字符,即\和"

因此,在这种情况下,\\d应该可以工作。 然而,将来如果有人遇到类似我的问题,只需转义双引号和反斜杠即可。


这并没有真正回答问题。如果您有不同的问题,可以通过点击 提问 来提出。为了在此问题获得新回答时得到通知,您可以关注此问题。一旦您具有足够的声誉,您还可以添加悬赏以吸引更多关注。- [审核中] (/review/late-answers/32714436) - Bouramas

0

你所需要做的就是放置

 *\
 ex: string ex = 'this is the character: *\\s';

在你的无效字符之前,而不是8个\ !!!!!


-1

我认为你需要将这两个转义字符添加到字符类中。试试这个:"[\d]{4}[\w]{3}(0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9]){2}"

--祝好运。


1
@MystikSpiral:\d\w是字符类。它们是预定义字符类[0-9][A-Za-z0-9_]简写(不是“快捷方式”)。除非您将它们与其他字符组合使用,例如[\d\s][\w,.!?],否则括号是多余的。 - Alan Moore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接