java中不一致的正则表达式字符类
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,因此匹配的结果是肯定的。那么,模式的解析是如何完成的呢?如果它抛出异常不是更好吗?该行为是正确的,并
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]]