在Java正则表达式中,如何获取字符类,例如[a-z]匹配-减号?
时间:2020-03-06 14:56:06 来源:igfitidea点击:
Pattern pattern = Pattern.compile("^[a-z]+$"); String string = "abc-def"; assertTrue( pattern.matcher(string).matches() ); // obviously fails
字符类是否可以匹配"-"?
解决方案
转义减号
[a-z -]
请勿在字符之间放置减号。
"[a-z-]"
这对我有用
Pattern p = Pattern.compile("^[a-z\-]+$"); String line = "abc-def"; Matcher matcher = p.matcher(line); System.out.println(matcher.matches()); // true
我将更具体地改写"不要放在字符之间"。
使破折号成为字符类中的第一个或者最后一个字符。例如," [-a-z1-9]"匹配小写字符,数字或者破折号。
在字符类[...]
中,如果-
的两边都被字符包围,则会被特殊对待(作为范围运算符)。这意味着,如果我们在字符类的开头或者结尾添加"-",则将按字面意义对待(非特殊)。
因此,我们可以使用正则表达式:
^[a-z-]+$
或者
^[-a-z]+$
由于我们添加的-
会按字面意义进行处理,因此无需对其进行转义。尽管这样做不是错误。
另一种(不建议使用的方式)是在字符类中不包含-
:
^(?:[a-z]|-)+$
请注意,在这种情况下括号不是可选的,因为|
的优先级非常低,因此在括号中:
^[a-z]|-+$
将在字符串开头匹配一个小写字母,并在结尾匹配一个或者多个-
。