Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java正则表达式中,如何获得字符类,例如[a-z]来匹配-减号?_Java_Regex - Fatal编程技术网

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