正则表达式的区别

时间:2017-01-11 17:20:34

标签: java regex

任何人都可以解释原因

text.replaceAll("\\W|\\d|\\s+", " ");

text.replaceAll("\\W|\\d", " ").replaceAll("\\s+", " ");

有什么不同?在第一个示例中,文本不会删除多于1个空格,在第二个示例中 - 它会删除。

5 个答案:

答案 0 :(得分:1)

String.replaceAll方法仅解析字符串一次,\W已包含\s。这就是为什么分支\s+永远不会在你的第一个代码中测试(左边的第一个分支获胜)。

在第二个代码中,使用\s+另一次解析整个字符串。

答案 1 :(得分:1)

因为在第一个例子中\ W占据每个空间(因此\ s +没有)并用空格替换它。 这仍然发生在第二个例子中,但是\ s +现在在\ W | \ d之后单独起作用,并将多个空格折叠成一个空格char。

尝试text.replaceAll(“[\\ W \\ d \\ s] +”,“”)

答案 2 :(得分:1)

您的第一个示例:\W|\d|\s+匹配:

  • 一个非单词字符(\W
  • 或一位数字(\d
  • 或一个或多个空格(\s+

这是一个懒惰的OR,所以每个' '与\W匹配,并被替换。

也许你想要(\W|\d|\s)+,其中重复整个群体。不过此处\s是多余的,因为它已包含在\W中。

对于单个字符,使用字符类而不是|通常更简单:

[\W\d]+.

答案 3 :(得分:0)

<强> REGEXP:

\w <= [^a-zA-Z0-9_] and whitespace
\d <= numbers
\s+ {
\s <= whitespace
+ <= 1 or more...
}

示例:(+)

\w+ <= [^a-zA-Z0-9_] and whitespace(1 or more)
\d+ <= numbers(1 or more)

结果:“\ w +”

hello123 => hello

结果:对于“\ d +”

hello123 => 123

结果:对于“\ w + \ d +”

hello123 => hello123

享受。

答案 4 :(得分:-1)

\W表示任何非单词字符([^a-zA-Z0-9_]),其中包含空格。

因此,在您的第一个模式中,\s+部分是多余的:它匹配任何单个空格字符并将其替换为" "。 Java中的replaceAll方法只解析字符串一次。