繁体   English   中英

Java 正则表达式转义字符

[英]Java Regex Escape Characters

我正在学习正则表达式,并在实施中遇到了麻烦。

我在 Java 教程中找到了RegexTestHarness并运行它,以下字符串正确标识了我的模式:

[\d|\s][\d]\.

(我的模式是任何两位数,或任何前面有空格,后跟句点的单个数字。)

该字符串是通过代码中的这一行获得的:

Pattern pattern = 
        Pattern.compile(console.readLine("%nEnter your regex: "));

当我尝试在 Eclipse 中编写一个简单的类时,它告诉我转义序列无效,除非我将字符串更改为:

[\\d|\\s][\\d]\\.

在我的课堂上,我使用`Pattern pattern = Pattern.compile(); 当我将此字符串放回TestHarness它找不到正确的匹配项。

有人能告诉我哪个是正确的吗? console.readLine()某些格式有区别吗?

\\是字符串文字"..."特殊字符。 它用于转义其他特殊字符,或创建像\\n \\r \\t这样的字符。
要在可以在正则表达式引擎中使用的字符串文字中创建\\字符,您需要通过在它之前添加另一个\\来对其进行转义(就像您在正则表达式中需要转义其元字符(如点\\. )时所做的那样)。 所以代表\\字符串看起来像"\\\\"

当您从用户读取数据时不存在此问题,因为您已经在读取文字,因此即使用户将在控制台中写入\\n它也会被解释为两个字符\\n


也没有必要添加| 内部类字符[...]除非您的目的是使该类也匹配| 字符,请记住[abc](a|b|c)相同,因此不需要| "[\\\\d|\\\\s]"

我的模式是任何两位数或一位数,前面是一个空格,后面是一个句点。)

正确的正则表达式将是:

Pattern pattern = Pattern.compile("(\\s\\d|\\d{2})\\.");

此外,如果您从用户输入中获取正则表达式字符串,那么您应该调用:

Pattern.quote(useInputRegex);

转义所有正则表达式特殊字符。

你也双重转义,因为第一个转义由 String 类处理,第二个转义传递给正则表达式引擎。

如果要在 Java 字符串文字中表示反斜杠,则需要使用另一个反斜杠对其进行转义,因此字符串文字"\\\\s"两个字符, \\s 这意味着要表示正则表达式[\\d\\s][\\d]\\. 在 Java 字符串文字中,您将使用"[\\\\d\\\\s][\\\\d]\\\\." .

请注意,我还对您的正则表达式稍作修改, [\\d|\\s]将匹配数字、空格或文字| 特点。 你只想要[\\d\\s] 字符类已经意味着“匹配其中之一”,因为您不需要| 对于字符类中的交替,它失去了它的特殊意义。

发生的事情是转义序列被评估了两次。 一次用于 Java,然后一次用于您的正则表达式。

结果是,当您使用正则表达式转义序列时,您需要对转义字符进行转义。

例如,如果你需要一个数字,你会使用

"\\d"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM