在java正则表达式中,如何获得一个字符类,例如[az]来匹配 - 减号?

dav*_*veb 18 java regex

Pattern pattern = Pattern.compile("^[a-z]+$");
String string = "abc-def";
assertTrue( pattern.matcher(string).matches() ); // obviously fails
Run Code Online (Sandbox Code Playgroud)

字符类是否可以匹配" - "?

Tom*_*lak 37

不要在字符之间加上减号.

"[a-z-]"
Run Code Online (Sandbox Code Playgroud)

  • 这个*是我所知道的每个正则表达方言中的正确语法.如果在符号类的开头或结尾处,减号不*必须被转义. (5认同)
  • 我真的不确定这是标准的regexp语法.我不怀疑它是否有效,但几乎肯定不是最佳做法. (2认同)

alb*_*ein 7

逃避减号[az\ - ]


cod*_*ict 6

在字符类[...]a -中,如果它被两边的字符包围,则会被特别处理(作为范围运算符).这意味着如果你-在字符类的开头或结尾包含它,它将被字面上处理(非特殊).

所以你可以使用正则表达式:

^[a-z-]+$
Run Code Online (Sandbox Code Playgroud)

要么

^[-a-z]+$
Run Code Online (Sandbox Code Playgroud)

由于-我们添加的内容正在逐字处理,因此无需逃避它.虽然如果你这样做并不是一个错误.

另一种(不太推荐)的方法是不在-字符类中包含:

^(?:[a-z]|-)+$
Run Code Online (Sandbox Code Playgroud)

请注意,在这种情况下,括号不是可选的,因为|它具有非常低的优先级,因此使用括号:

^[a-z]|-+$
Run Code Online (Sandbox Code Playgroud)

将匹配字符串开头的小写字母和-末尾的一个或多个.