java regex replaceAll with negated groups

java regex replaceAll with negated groups

我正在尝试将 String.replaceAll() 方法与正则表达式结合使用,以仅保留字母字符和 ['-_]。我试图通过用空字符串替换既不是字母也不是上述字符之一的每个字符来做到这一点。

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

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

你不需要前瞻,只需要使用取反的正则表达式:

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

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

你的正则表达式太复杂了。只需指定要保留的字符,并使用 ^ 取反,因此 [^a-z'_-] 表示 "anything but these".

public class Replacer {
    public static void main(String[] args) {
        System.out.println("with 1234 &*()) -/.,>>?chars".replaceAll("[^\w'_-]", ""));
    }
}

让它更简单:

current  = current.replaceAll("[^a-zA-Z'_-]", "");

说明: 将不在 a 中的任何字符匹配到 zAZ'_-replaceAll() 方法将替换任何匹配的字符。

测试输入:"a_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]