我正在学习正则表达式,并在实现中遇到麻烦。
我在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()
的区别是什么?
答案 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"