java中的正则表达式否定否定了嵌套类

时间:2016-12-13 12:22:05

标签: java regex regex-negation

我有以下程序来替换特殊字符

      String a = "fgA9.^";
       String b ="";
       a = a.replaceAll("[^[a-zA-Z0-9]]", b);
       System.out.println(a); 

这打印(。^)作为输出但我希望正则表达式模式否定字母,数字并替换特殊字符。

我可以通过a = a.replaceAll("[[^a-zA-Z0-9]]", b);

查看我的预期输出

两者之间有什么区别,在这两种情况下我都使用否定?

1 个答案:

答案 0 :(得分:2)

使用嵌套字符类,您创建了union

  

您还可以使用联盟创建由两个或多个单独的字符类组成的单个字符类。要创建联合,只需将一个类嵌套在另一个类中,例如[0-4[6-8]]。此特定联合创建一个与数字012346,{{匹配的字符类1}}和7

8正则表达式匹配字母数字字符,因为模式由"[^[a-zA-Z0-9]]"(忽略空联合部分)和匹配ASCII字母和数字的[^]组成。

[a-zA-Z0-9]模式中,您指示了一个否定的字符类[[^a-zA-Z0-9]],它匹配任何字符,但是ASCII字母/数字,并且与空部分联合,再次被忽略。

[^a-zA-Z0-9]正则表达式在语义上完全等同于[0-4[6-8]],并且在组合否定字符和正字符类时可以观察到更实用的联合值。例如。 [0-46-8]将匹配除字母([^\p{L}[a-c]]+)和三个小写[^\p{L}]ab字符之外的一个或多个字符。