[英]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.