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"