java中不一致的正则表达式字符类

java中不一致的正则表达式字符类,java,regex,Java,Regex,Java如何处理接收不一致的正则表达式模式?我正在尝试: Pattern p = Pattern.compile("[a-d[m-p][^d][m]]"); Matcher m = p.matcher("d"); System.out.println(m.matches()); 我得到的是真实的。但是,我的角色类包含[^d],因此根据正则表达式,它不应该匹配。但是,由于模式(a-d)中也包含d,因此匹配的结果是肯定的。那么,模式的解析是如何完成的呢?如果它抛出异常不是更好吗?该行为是正确的,并

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

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

我得到的是真实的。但是,我的角色类包含[^d],因此根据正则表达式,它不应该匹配。但是,由于模式(a-d)中也包含d,因此匹配的结果是肯定的。那么,模式的解析是如何完成的呢?如果它抛出异常不是更好吗?

该行为是正确的,并且:

字符类可能出现在其他字符类中,并且可能由并集运算符(
隐式
)和交集运算符(
&&
)组成

另见:

[a-d[m-p]
通过
d
m
通过
p
[a-dm-p]
(联合)

因此,模式匹配:

  • [
    -字符类的开始
  • a-d
    -
    a
    d
  • [m-p]
    -
    m
    通过
    p
  • [^d]
    -不是
    d
  • [m]
    -
    m
  • ]
    -字符类结束
d
a-d
匹配时,将返回匹配

如果要匹配除某些符号外的一系列符号,则需要进行减法:


此正则表达式将不匹配
d
,因为
a-d
范围现在与
&&[^d]
进行了“调和”,并且将不再匹配
d

为什么不一致?对于Java来说,这很好。我说不一致,因为我在模式中包含并排除了字母“d”。尽管使用
-verbose
选项更正“智能”编译器可能会告诉
“[m]选项多余,[^d]没有效果-您的意思是“&&[^d]“?
。最好是一些像FindBugs这样的工具,标记这样的缺陷。没错,完全忘记了工会是一个简单的“或”。谢谢。仅供参考:您可以在
[a-d[m-p][m]&&[^d]]