java正则表达式unclosed字符类

时间:2013-01-18 00:40:23

标签: java regex matcher

我需要一些帮助。我得到了:

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);

我必须使用unicode值,因为我正在使用xhtml。

任何帮助都会很棒!

2 个答案:

答案 0 :(得分:12)

假设您要匹配\-而不是]

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

你需要双重转义反斜杠,因为\也是正则表达式中的转义字符。因此\\]逃避了java的反斜杠而不是正则表达式。您需要添加另一个java-escaped \,以便regex-escape您的第二个java-escaped \

java转义后\\\\变为\\,然后正则表达式转义为\

-移动到序列的末尾意味着将其用作字符,而不是Pshemo指出的范围运算符。

答案 1 :(得分:2)

很难说你想要达到什么目标,但我可以在你的正则表达式中看到一些奇怪的东西:

  1. 你已经打开了一类角色但从未关闭它。相反,您使用\\]使]正常字符。
    • 如果您想在字符类中加入],那么最后需要额外的],例如"^[a-zA-Z\300-\3770-9\u0153\346 \u002F.'-\\]]*$"
    • 如果你想在你的角色类中包含\那么你需要使用\\\\版本,因为你需要在regex引擎和Javas String中两次逃避它的特殊含义
  2. 您将-'-\\]一起用于字符类,用于指定a-zA-Z等字符范围。要逃避其特殊含义,您需要使用\\-