Java正则表达式逃脱角色

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

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

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

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

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

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

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

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

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

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

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

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


添加|也没有意义 内部类字符[...]除非你的意图是使该类也匹配| 记住, [abc](a|b|c)相同,所以不需要|"[\\d|\\s]"

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

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

My pattern is any double digit or single digit preceded by a space, followed by a period.)

正确的正则表达式将是:

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

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

 Pattern.quote(useInputRegex); 

逃避所有正则表达式的特殊字符。

你也可以双重转义,因为1个转义由String类处理,第二个转发给regex引擎。

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

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

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

 "\\d"