Java正则表达式转义字符

问题描述:

我正在学习正则表达式,并在实现中遇到了麻烦。Java正则表达式转义字符

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

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

(我的模式是任何两位数,或者前面有一个空格任何一个数字,然后通过一段时间)

这串由该行代码获得:

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

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

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

在我的课堂我使用`Pattern pattern = Pattern.compile(); 当我把这个字符串回没有关系的TestHarness找不到正确的匹配。

有人能告诉我哪一个是正确的吗?是否与console.readLine()有些格式不同?

+2

您需要了解字符串文字和_Java_字符串转义如何工作。 – SLaks

+0

此外,您的正则表达式不强制执行两位数字之前的空格。使用anubhava的正则表达式。 – Gus

+0

我只在个位数字或双位数字前面寻找空格(不关心前面的数字)。 –

\是字符串文字"..."中的特殊字符。它用于转义其他特殊字符,或者创建像\n\r\t这样的字符。
要在字符串文字中创建\字符,您可以在正则表达式引擎中使用该字符,您需要在其之前添加另一个\(就像您在正则表达式中那样需要转义其元字符,如点号\.时)。所以代表\的字符串看起来像"\\"

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


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

+0

谢谢。这就解释了为什么通过示例程序/命令行输入模式与编译时输入模式不同。 –

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类处理的,第二个转义是传递给正则表达式引擎的。

+0

对不起,我原来的帖子(引用)很差。我匹配以空格开头的单个数字或两位数字;在任何一种情况下,都会加一个'.'。 –

+0

哦,我明白了。根据您的意见更新答案。 – anubhava

发生了什么是转义序列正在评估两次。一次为java,然后一次为你的正则表达式。

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

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

"\\d" 

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

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