是 - *在正则表达式中有任何特殊含义吗?

时间:2014-06-09 19:22:22

标签: java regex

我有字符串:

String str = Hello+Bye-see*Go/ok

现在,我想根据+-*/进行拆分。所以我做了:

str.split("[+-*/]");

但这失败了,引发了一个错误:

Exception in thread "main" java.util.regex.PatternSyntaxException: Illegal character range near index 3
[+-*/]
   ^
    at java.util.regex.Pattern.error(Pattern.java:1924)
    at java.util.regex.Pattern.range(Pattern.java:2594)
    at java.util.regex.Pattern.clazz(Pattern.java:2507)
    at java.util.regex.Pattern.sequence(Pattern.java:2030)
    at java.util.regex.Pattern.expr(Pattern.java:1964)
    at java.util.regex.Pattern.compile(Pattern.java:1665)
    at java.util.regex.Pattern.<init>(Pattern.java:1337)
    at java.util.regex.Pattern.compile(Pattern.java:1022)
    at java.lang.String.split(String.java:2313)
    at java.lang.String.split(String.java:2355)

然后我将正则表达式更改为:

str.split("[-+*/]");

它完美无缺!所以我想知道-*是否有任何特殊含义?我在正则表达式[+-*/]中做错了什么?

1 个答案:

答案 0 :(得分:17)

:一种。错误在哪里?

问题不在于-*。问题是在[character class]中,连字符-具有特殊含义。例如,在[a-z]中,它表示所有字符,范围从a到z 。因此,当您的角色类中有+-*时,我们正在寻找从+(ASCII 43)到*(ASCII 42)的字符。无效,因此错误。从技术上讲,正如@Pshemo在评论中所写,Java不使用基于ASCII但基于Unicode表的字符索引。但由于Unicode中的128个第一个ASCII字符点相同,因此结果相同。

您需要像\-那样转义连字符,或者如您所见,将-抛出到您班级的前面(或后面),此处它不表示字符范围:

[-+*/]

因此,在分割中(使用“后面的”版本):

String[] result = your_original_string.split("[+*/-]");

<强> B中。但是[*-+]会有效! (ASCII 42至43)

如果您反转+*,则您有一个有效的ASCII范围(42到43)。当然没有必要这样做,因为(i)中间没有人物,(ii)会让我的狗感到困惑。

<强>℃。 -*有特殊含义吗?

确实如此,但不是在角色类中。在字符类之外,这意味着匹配连字符,零次或多次