任何人都可以解释原因
text.replaceAll("\\W|\\d|\\s+", " ");
和
text.replaceAll("\\W|\\d", " ").replaceAll("\\s+", " ");
有什么不同?在第一个示例中,文本不会删除多于1个空格,在第二个示例中 - 它会删除。
答案 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
方法只解析字符串一次。