正则表达式中的双斜杠点号

3

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

这个问题要求找到只包含字母并且最多有一个句号结尾的“单词”。 例如,如果我输入字符串:

one two. wr7ng not1 three. nope..

引擎将会匹配到“one”、“two”和“three”这三个单词。解决此问题的方法是使用以下模式:

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

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

[a-zA-Z]+.?

我发现只有后者在最后一个位置(即句点)错误地接受了数字。这是唯一的区别吗?


1
也许这是一个打字错误,它们应该是反斜杠。据我所知,正则表达式中的正斜杠不是特殊字符,但 . 是,如果要像普通的 . 一样使用它,则必须对其进行转义。 - Hunter McMillen
5个回答

5

你确定不是反斜杠吗?

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

在文本字符串中,两个反斜杠会被解释为“在文本字符串中插入单个反斜杠”。(在许多语言中,反斜杠后面的任何字符都表示“插入该字符”)。
当将文本字符串解释为正则表达式时,实际文本
         \.

意思是“将'period'作为字面字符匹配”。

如果没有反斜杠“转义字符”,则在大多数正则表达式引擎中,.表示“匹配任何字符”。


好的,非常感谢您的解释,我明白了! - jahmezz

4

看起来你打错了,应该是"[a-zA-Z]+\\."

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


4
准确的正则表达式为:
[a-zA-Z]+\.?

如果要使用Java编译它,您需要再加一个反斜杠\,这表示Java字符串中的转义字符:

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

1

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

如果这不合理,那么要么是打错了,要么是你读错或者写错了正则表达式。显然的“更正”方法是将前斜杠替换为反斜杠,得到如下结果:

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

这意味着“匹配罗马字母,后面跟一个可选的'.'”。在上下文中,这可能意味着一个英语单词后面跟着一个句号。


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

1

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

使用 \. 将会出现编译器错误,即非法转义字符。

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

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

对于单个 . (点)字符,您使用 \\ . 。 现在针对您的 . (点)字符的“最多一次”部分,您将使用量词符,表示“一个或多个”。您的表达式 . 部分变成了 \\.?

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接