替换除一个之外的所有特殊字符

string = str.replaceAll("\\W", " ") 

这用“”(空格)替换所有特殊字符。

但我尝试将短划线“ – ”排除为特殊字符。

这是我的尝试:

 string = str.replaceAll("\\W[^-]", " ") 

但这不是我所期待的。

:我该如何做到这一点?

如果你想匹配除\w-之外的所有字符,你可以使用:

 [^\w-] 

例如:

 str.replaceAll("[^\\w-]+", " ") 

在这种特殊情况下, Qtax的答案可能是最简单的,因为\W有内置的补码,即\w 。 但总的来说,知道Java的正则表达式引擎支持使用&&运算符在字符类中的“交叉点”是有用的 – 你可以说

 [\W&&[^-]] 

匹配单个字符既是\W [^-] ,即非单词字符,但也不是连字符。

使用否定的字符类……

 string = str.replaceAll("[^\\w-]", " ") 

\W非常方便,但是当你需要在池中添加额外的字符时,你需要使用带有\w的字符类。

这不起作用的原因……

 string = str.replaceAll("\\W[^-]", " ") 

…是因为它正在扫描非单词字符( [^A-Za-z0-9_] ),后面跟不是 -字符。 例如, /A将匹配,但/-不匹配。