的java正则表达式模式没有结束的字符类(java regex pattern unclosed c

2019-07-18 08:51发布

我需要一些帮助。 我越来越:

Caused by: java.util.regex.PatternSyntaxException: Unclosed character class near index 24
^[a-zA-Z└- 0-9£µ /.'-\]*$
                        ^
        at java.util.regex.Pattern.error(Pattern.java:1713)
        at java.util.regex.Pattern.clazz(Pattern.java:2254)
        at java.util.regex.Pattern.sequence(Pattern.java:1818)
        at java.util.regex.Pattern.expr(Pattern.java:1752)
        at java.util.regex.Pattern.compile(Pattern.java:1460)
        at java.util.regex.Pattern.<init>(Pattern.java:1133)
        at java.util.regex.Pattern.compile(Pattern.java:823)

这里是我的代码:

String testString = value.toString();

Pattern pattern = Pattern.compile("^[a-zA-Z\300-\3770-9\u0153\346 \u002F.'-\\]*$");
Matcher m = pattern.matcher(testString);

我有,因为我与XHTML工作使用Unicode值一些。

任何帮助将是巨大的!

Answer 1:

假设你想匹配\-而不是]

Pattern pattern = Pattern.compile("^[a-zA-Z\300-\3770-9\u0153\346 \u002F.'\\\\-]*$");

你需要加倍逃避你的反斜杠, \也是正则表达式的转义字符。 因此\\]逃脱的Java而不是正则表达式的反斜杠。 您需要添加另一个Java转义\以正则表达式,逃避你的第二个Java的转义\

所以\\\\后的Java转义变得\\这是正则表达式,然后逃到\

移动-到该序列的末端意味着它被用作一个字符,而不是范围运算符由Pshemo指出。



Answer 2:

这是很难说有什么是你想实现的,但我可以看到你的正则表达式的一些奇怪的事情:

  1. 你已经打开类的人物,但永远不会关闭它。 相反,你用\\]这使得]普通字符。
    • 如果您希望包括]在你的人物类,那么你需要额外]结尾,像"^[a-zA-Z\300-\3770-9\u0153\346 \u002F.'-\\]]*$"
    • 如果您要包括\在你的人物类,那么你需要使用\\\\版本,因为你需要逃脱它的特殊含义的两倍,在正则表达式引擎,并在Java类的字符串
  2. 您使用的-与( '-\\]其在字符类用于指定类似的字符的范围azAZ 。 为了逃避它的特殊含义,你需要使用\\-


文章来源: java regex pattern unclosed character class