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 ),因此匹配的结果为正。那么,如何解析模式呢?如果它抛出异常会不会更好?
答案 0 :(得分:5)
行为正确且documented:
字符类可以出现在其他字符类中,并且可以由union运算符(
implicit
)和交集运算符(&&
)组成。
另见Java Character Classes reference:
[a-d[m-p]]
a
到d
,或m
到p
:[a-dm-p]
(联盟)
因此,模式匹配:
[
- 字符类的开头a-d
- a
到d
或 [m-p]
- m
到p
或 [^d]
- 不是d
或 [m]
- m
]
- 字符类的结尾。当d
与a-d
匹配时,会返回匹配。
如果你想匹配除之外的一系列符号,你需要减法:
[a-d[m-p][m]&&[^d]]
这个正则表达式不会与d
匹配,因为a-d
范围现在已经过了"老化"使用&&[^d]
且不再匹配d
。