java regex replaceAll with negated groups

时间:2015-12-17 15:08:57

标签: java regex regex-negation

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

到目前为止,我尝试过这样的(在不同的版本中)正确保留字母,但替换了我想保留的特殊字符:

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

4 个答案:

答案 0 :(得分:0)

你不需要先行,只需使用否定的正则表达式:

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

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

答案 1 :(得分:0)

你的正则表达式太复杂了。只需指定要保留的字符,并使用^否定,因此[^a-z'_-]表示"除了这些"之外的所有内容。

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

答案 2 :(得分:0)

简化:

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

说明: 将a以内的所有字符与zAZ'_-和{{1方法将替换任何匹配的char。

测试输入:replaceAll() 输出:"a_zE'R-z4r@m"

答案 3 :(得分:0)

你可以试试这个:

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]