我有字符串:
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("[-+*/]");
它完美无缺!所以我想知道-*
是否有任何特殊含义?我在正则表达式[+-*/]
中做错了什么?
答案 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)会让我的狗感到困惑。
<强>℃。 -*
有特殊含义吗?
确实如此,但不是在角色类中。在字符类之外,这意味着匹配连字符,零次或多次。