Java的正则表达式转义字符

问题描述 投票:1回答:4

我正在学习正则表达式,并运行到在实施麻烦。

我发现Java教程的RegexTestHarness,并运行它,下面的字符串正确识别我的模式:

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

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

该字符串是通过该线路码获得:

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

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

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

在我的课,我using`Pattern pattern = Pattern.compile();当我把这个字符串回到TestHarness没有找到正确的匹配。

有人能告诉我哪一个是正确的?在从console.readLine()一些格式的区别?

java regex
4个回答
3
投票

\是在字符串"..."特殊字符。它是用来逃脱其它特殊字符,或者创建类似\n \r \t字符。 要在字符串字面量\字符可以在正则表达式引擎使用您需要通过添加之前另一\(就像你在正则表达式做的时候,你需要逃脱它的元字符像点\.),以逃避它。所以字符串代表\看起来像"\\"

当您从用户读取数据这个问题不存在,因为您已经阅读文字,这样即使用户将在控制台\n它会被解释成两个字符\n写。


也有是在加入阶级性|[...]没有意义,除非你的意图是使类还匹配|字符,请记住,[abc]是一样的(a|b|c)所以没有必要在| "[\\d|\\s]"


2
投票

如果你想表示一个Java字符串字面反斜杠,你需要用一个反斜杠逃逸,所以字符串文字"\\s"是两个字符,\s。这意味着,代表在Java字符串文字,你会使用[\d\s][\d]\.正则表达式"[\\d\\s][\\d]\\."

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


2
投票

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

正确的正则表达式为:

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

此外,如果你要根据用户输入的正则表达式的字符串,然后您应该拨打:

Pattern.quote(useInputRegex);

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

你也是双逃脱,因为1个逃生由String类的处理,第二一个被传递给正则表达式引擎。


0
投票

正在发生的事情是,转义序列被两次评估。一旦对于Java,然后一旦你的正则表达式。

其结果是,你需要躲避转义字符,当你使用正则表达式转义序列。

举例来说,如果你需要一个数字,你会使用

"\\d"
© www.soinside.com 2019 - 2024. All rights reserved.