java正则表达式用否定的组替换所有

java正则表达式用否定的组替换所有,java,regex,regex-negation,Java,Regex,Regex Negation,我正在尝试将String.replaceAll()方法与regex一起使用,以仅保留字母字符和['-\]。我试着用一个空字符串替换每个既不是字母也不是上述字符的字符 到目前为止,我已经尝试过这样的方法(在不同的变体中),它正确地保留字母,但替换了我想要保留的特殊字符: current = current.replaceAll("(?=\\P{L})(?=[^\\'-_])", ""); 您不需要向前看,只需使用否定正则表达式: current = current.replaceAll("[^\

我正在尝试将
String.replaceAll()
方法与regex一起使用,以仅保留字母字符和
['-\]
。我试着用一个空字符串替换每个既不是字母也不是上述字符的字符

到目前为止,我已经尝试过这样的方法(在不同的变体中),它正确地保留字母,但替换了我想要保留的特殊字符:

current = current.replaceAll("(?=\\P{L})(?=[^\\'-_])", "");

您不需要向前看,只需使用否定正则表达式:

current = current.replaceAll("[^\\p{L}'_-]+", "");

[^\\p{L}'.-]
将匹配任何非字母(unicode)、单引号、下划线或连字符的内容。

您的正则表达式太复杂。只需指定要保留的字符,并使用
^
进行求反,因此
[^a-z'.-]
表示“除此之外的任何内容”

让它更简单:

current  = current.replaceAll("[^a-zA-Z'_-]", "");
说明: 将
a
中的任何字符匹配到
z
a
z
-
-
replaceAll()
方法将用零替换任何匹配的字符

测试输入:
“a\u zE'R-z4r@m“
输出:
a_zE'R-zrm

您可以尝试以下方法:

String str = "Se@rbi323a`and_Eur$ope@-t42he-[A%merica]";
str = str.replaceAll("[\\d+\\p{Punct}&&[^-'_\\[\\]]]+", "");
System.out.println("str = " + str);
结果是:

str = Serbia'and_Europe-the-[America]

请注意,在方括号中,
'-
表示“介于
'
之间的任何字符”,这可能不是您想要的。您应该转义
-
或将其放在
]
之前的最后一个位置。
str = Serbia'and_Europe-the-[America]