正则表达式中的双正斜杠期

时间:2012-05-27 04:41:11

标签: java regex

我最近开始在Java中使用正则表达式,但我遇到了一个奇怪的表达。

问题要求找到仅由字母组成的“单词”,最多只有一个结束时期。 例如,如果我输入字符串:

one two. wr7ng not1 three. nope..

引擎会找到一个,两个和三个作为匹配的单词。问题的解决方案是这个模式:

for (String tok : s.split(" ")) {
  if (tok.matches("[a-zA-Z]+//.?")) {
    // code done to record successful match
  }
}

这两个正斜杠是什么意思?我将这个表达式与这个表达式进行了比较:

[a-zA-Z]+.?

发现只有后者错误地接受了最后一个时段(句号)中的数字。这是唯一的区别吗?

5 个答案:

答案 0 :(得分:5)

你确定它不是反斜杠吗?

  "[a-zA-Z]+\\.?"

文字字符串中的两个反斜杠被解释为“在文字字符串中插入单个反斜杠”。 (作为惯例,在许多语言中,反斜杠anychar意味着“插入anychar”)。

当文字字符串被解释为正则表达式时, 实际文本

         \.

表示“将'句号'作为文字字符匹配”。

如果您没有反斜杠“转义字符”,则大多数Regexp引擎意味着“匹配任何字符”。

答案 1 :(得分:2)

看起来你有一个错字。它应该是"[a-zA-Z]+\\."

该字符串值成为正则表达式值[a-zA-Z]+\.。反斜杠表示应将.视为文字句点。没有它,.是一个特殊的正则表达式元字符,匹配任何单个字符(包括数字)。

答案 2 :(得分:2)

确切的RE是:

[a-zA-Z]+\.?

并使用Java编译它,你需要一个反斜杠\,这意味着Java字符串中的转义字符:

"[a-zA-Z]+\\.?"

答案 3 :(得分:1)

正斜杠在正则表达式中没有特殊含义,因此“//”表示匹配两个正斜杠。

如果这没有意义,这可能是一个错字,或者你误读或错误地转录了正则表达式。用反斜杠替换正斜杠的明显“修正”给出了:

    tok.matches("[a-zA-Z]+\\.?")

表示“匹配罗马字母后跟可选的'.'”。在上下文中,可以表示英文单词,后跟fullstop / period。


对于记录,"[a-zA-Z]+.?"匹配一个或多个罗马字母,后跟(可选)一个字符。 +运算符的“急切”意味着可选字符将是非字母......如果有的话。

答案 4 :(得分:1)

使用.(点)将被解释为正则表达式字符,表示“任何字符”。

使用\.会产生编译错误。非法逃脱角色

使用\\.将被解释为一个简单的.(点)字符,这是您需要使用的字符。

因此,对于仅包含字母的单词,您使用[a-zA-Z]+,其中+(加号)是一个量词,表示“一个或多个”。

对于单个.(点)字符,您使用\\.。 现在,对于.(点)字符的“最近一次”部分,您将使用?量词,这意味着“一个或多个”。您对.部分的表达式变为\\.?

因此,您的正则表达式将为[a-zA-Z]+\\.?