Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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 为什么string.matches[";&x2B;-*/";]会报告模式异常?_Java_Regex - Fatal编程技术网

Java 为什么string.matches[";&x2B;-*/";]会报告模式异常?

Java 为什么string.matches[";&x2B;-*/";]会报告模式异常?,java,regex,Java,Regex,我有以下代码: public static void main(String[] args) { String et1 = "test"; String et2 = "test"; et1.matches("[-+*/]"); //works fine et2.matches("[+-*/]"); //java.util.regex.PatternSyntaxException, why? } 因为“-”是转义字符?但是,如果“-”与“+

我有以下代码:

public static void main(String[] args) {
       String et1 = "test";
       String et2 = "test";
       et1.matches("[-+*/]"); //works fine
       et2.matches("[+-*/]"); //java.util.regex.PatternSyntaxException, why?
}

因为“-”是转义字符?但是,如果“-”与“+”切换,它为什么工作良好呢?

-
在字符类中(使用
[xxx]
)定义一个范围,例如:所有小写字符的
[a-z]
。如果你想说“破折号”,它必须在第一个或最后一个位置。我通常把它放在第一位以避免混淆


或者,您也可以对其进行转义:
[+\-*/]
-
在字符类(
[xxx]
)内用于定义范围,例如:所有小写字符的
[a-z]
。如果你想说“破折号”,它必须在第一个或最后一个位置。我通常把它放在第一位以避免混淆


或者可以对其进行转义:
[+\-*/]

这是因为
-
用于定义字符类中的字符范围。由于在ascii表中,
+
位于
*
之后,因此该范围没有意义,您将获得一个错误

在字符类的中间有一个文字“代码> -/CODE”,必须避免它。如果

-
位于类的开头或结尾,则没有问题,因为它是明确的

不需要转义
-
的另一种情况是,以前有字符类快捷方式,例如:

[\\d-abc]  

(其他正则表达式引擎,如pcre,在字符类快捷方式放在
[abc-\d]
之后时也允许这样做,但Java似乎不允许这样做。)

这是因为
-
用于定义字符类中的字符范围。由于在ascii表中,
+
位于
*
之后,因此该范围没有意义,您将获得一个错误

在字符类的中间有一个文字“代码> -/CODE”,必须避免它。如果

-
位于类的开头或结尾,则没有问题,因为它是明确的

不需要转义
-
的另一种情况是,以前有字符类快捷方式,例如:

[\\d-abc]  

(其他正则表达式引擎(如pcre)在字符类快捷方式放在
[abc-\d]
之后时也允许这样做,但Java似乎不允许这样做。)

仅供参考,Java正则表达式元字符定义如下:

或:


无论顺序如何,都可以工作。

仅供参考,Java正则表达式元字符定义如下:

或:


无论顺序如何,都可以工作。

我认为您应该使用:[\-\+\*/]
因为:“-”来定义范围,例如:[a-d]它的意思是:a,b,c,d

我想你应该用:[\-\+\*/]
因为:“-”来定义范围,例如:[a-d]它的意思是:a,b,c,d

在这种情况下,实际上没有必要转义括号内的任何内容。在这种情况下,实际上没有必要转义括号内的任何内容。
et2.matches("[\\+\\-\\*/]");
et2.matches("[\\-\\+\\*/]");