在java正则表达式中,如何获得字符类,例如[a-z]来匹配-减号?
是否可以让字符类与“-”匹配?转义减号在java正则表达式中,如何获得字符类,例如[a-z]来匹配-减号?,java,regex,Java,Regex,是否可以让字符类与“-”匹配?转义减号 Pattern pattern = Pattern.compile("^[a-z]+$"); String string = "abc-def"; assertTrue( pattern.matcher(string).matches() ); // obviously fails 不要把减号放在字符之间 [a-z\\-] 这对我有用 "[a-z-]" 我要把“不要把它放在两个角色之间”的措辞更具体一点 使破折号成为字符类中的第一个或最后一个字符。例
Pattern pattern = Pattern.compile("^[a-z]+$");
String string = "abc-def";
assertTrue( pattern.matcher(string).matches() ); // obviously fails
不要把减号放在字符之间
[a-z\\-]
这对我有用
"[a-z-]"
我要把“不要把它放在两个角色之间”的措辞更具体一点
使破折号成为字符类中的第一个或最后一个字符。例如,“[-a-z1-9]”匹配小写字符、数字或破折号。在字符类中
[…]
如果-
两侧都被字符包围,则将其作为范围运算符进行特殊处理。这意味着,如果在字符类的开头或结尾包含-
,它将被逐字处理(非特殊)
因此,您可以使用正则表达式:
Pattern p = Pattern.compile("^[a-z\\-]+$");
String line = "abc-def";
Matcher matcher = p.matcher(line);
System.out.println(matcher.matches()); // true
或
由于我们添加的-
被逐字处理,因此没有必要逃避它。虽然如果你这么做了也不是错误
另一种(不太推荐的)方法是在字符类中不包含-
:
^[-a-z]+$
请注意,在这种情况下,括号不是可选的,因为|
的优先级非常低,因此使用括号时:
^(?:[a-z]|-)+$
将在字符串的开头匹配一个小写字母,在字符串的结尾匹配一个或多个
-
。这已被否决,但也可以使用。我总是把破折号放在末尾。我真的不确定这是否是标准的regexp语法。我不怀疑它是否有效,但它几乎肯定不是最佳实践。这是我所知道的每个regexp方言的正确语法。如果减号位于字符类的开头或结尾,则不必对其进行转义。请参阅:(作为许多示例之一)它不能是以']'结尾的字符序列。这将产生不明确的语法,因此是不允许的。唯一可能存在结束方括号的地方是在开始方括号的正后方(“[]a-z-]”)或在否定方括号的正后方(“[^]a-z-]”)。奇怪的是,如果您的行是“abc\def”,它也起作用吗?在我看来,您似乎同时匹配了\和-chars。@Parappa:matching\要求\\处于模式中(即Java中的“^[a-z\\\\-]+$”
)。
^(?:[a-z]|-)+$
^[a-z]|-+$