3

我最近开始在 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]+.?

并且在最后一个插槽(句点)中只发现了后者错误接受的数字。这是唯一的区别吗?

4

5 回答 5

5

你确定不是反斜杠吗?

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

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

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

         \.

意思是,“将‘句点’匹配为文字字符”。

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

于 2012-05-27T04:53:25.260 回答
3

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

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

于 2012-05-27T04:54:43.060 回答
3

确切的 RE 是:

[a-zA-Z]+\.?

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

"[a-zA-Z]+\\.?"
于 2012-05-27T05:15:21.157 回答
1

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

如果这没有意义,这要么是一个错字,要么是您误读或错误转录了正则表达式。用反斜杠替换正斜杠的明显“更正”给出了这个:

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

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


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

于 2012-05-27T04:53:51.973 回答
1

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

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

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

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

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

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

于 2012-05-27T05:11:29.700 回答