在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]|-+$

将在字符串开头匹配一个小写字母,并在结尾匹配一个或者多个-