java中的regex字符类不一致

时间:2016-08-01 10:31:25

标签: java regex

Java如何处理接收不一致的正则表达式模式?我正在尝试这个:

Pattern p = Pattern.compile("[a-d[m-p][^d][m]]");
Matcher m = p.matcher("d");
System.out.println(m.matches());

我收到的是真的。但是,我的字符类包含[^ d],因此根据正则表达式,它不应该匹配。但由于 d 也包含在模式中( a-d ),因此匹配的结果为正。那么,如何解析模式呢?如果它抛出异常会不会更好?

1 个答案:

答案 0 :(得分:5)

行为正确且documented

  

字符类可以出现在其他字符类中,并且可以由union运算符(implicit)和交集运算符(&&)组成。

另见Java Character Classes reference

  

[a-d[m-p]] ad mp[a-dm-p] (联盟)

因此,模式匹配:

  • [ - 字符类的开头
  • a-d - ad
  • [m-p] - mp
  • [^d] - 不是d
  • [m] - m
  • ] - 字符类的结尾。

da-d匹配时,会返回匹配。

如果你想匹配之外的一系列符号,你需要减法

[a-d[m-p][m]&&[^d]]

这个正则表达式不会与d匹配,因为a-d范围现在已经过了"老化"使用&&[^d]且不再匹配d