5

我需要帮助。我越来越:

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。

任何帮助都会很棒!

4

2 回答 2

20

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

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

您需要双重转义反斜杠,\正则表达式中的转义字符也是如此。因此\\]转义了 java 的反斜杠,但不是正则表达式。您需要添加另一个 java-escaped\以便对您的第二个 java-escaped 进行正则表达式转义\

所以\\\\在 java 转义之后变成\\which 正则表达式转义到\.

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

于 2013-01-18T00:53:24.510 回答
2

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

  1. 您已经打开了一类字符,但从未关闭它。取而代之的是,您使用\\]了使]字符正常的。
    • 如果你想包含]在你的角色类中,那么最后你需要额外]的,比如"^[a-zA-Z\300-\3770-9\u0153\346 \u002F.'-\\]]*$"
    • 如果你想包含\在你的字符类中,那么你需要使用\\\\版本,因为你需要在正则表达式引擎和 Java 字符串中两次转义它的特殊含义
  2. -与 ( '-\\]) 一起使用,它在字符类中用于指定字符范围,例如a-zor A-Z。为了逃避它的特殊含义,你需要使用\\-
于 2013-01-18T00:46:31.357 回答