Java正则表达式转义字符

时间:2013-12-18 21:36:07

标签: java regex

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

我在Java Tutorials上找到RegexTestHarness并运行它,以下字符串正确识别我的模式:

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

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

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

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

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

,否则不会编译
[\\d|\\s][\\d]\\.

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

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

4 个答案:

答案 0 :(得分:3)

\是字符串文字"..."中的特殊字符。它用于转义其他特殊字符,或创建\n \r \t等字符。
要在可以在regex引擎中使用的字符串文字中创建\字符,您需要通过在它之前添加另一个\来转义它(就像在regex中那样,当你需要转义它的元字符如dot {时) {1}})。因此,代表\.的字符串看起来像\

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


除了你的意图是使该类也匹配n字符之外,在类字符|中添加[...]也没有意义,请记住|是相同的为[abc],因此(a|b|c)中不需要|

答案 1 :(得分:2)

  

我的模式是以空格开头的任何两位数或单个数字,后跟句点。)

正确的正则表达式将是:

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

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

Pattern.quote(useInputRegex);

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

你也可以双重转义,因为1个转义由String类处理,第二个转发到正则表达式引擎。

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

正在发生的事情是逃逸序列正在被评估两次。一次用于java,然后一次用于你的正则表达式。

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

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

"\\d"