【问题标题】:java regex pattern unclosed character classjava正则表达式模式未封闭字符类
【发布时间】:2013-01-01 16:18:10
【问题描述】:

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

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。

任何帮助都会很棒!

【问题讨论】:

    标签: java regex matcher


    【解决方案1】:

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

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

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

    所以\\\\在java转义后变成\\,然后正则表达式转义为\

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

    【讨论】:

    • 我想每个人都明白了。我没有意识到我需要将 '\' 翻四倍才能在我的正则表达式中实现反斜杠。感谢大家的意见。
    【解决方案2】:

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

    1. 您打开了字符类但从未关闭它。相反,您使用了\\],这使得] 成为正常字符。
      • 如果你想在你的角色类中包含],那么你需要在最后添加],比如"^[a-zA-Z\300-\3770-9\u0153\346 \u002F.'-\\]]*$"
      • 如果您想在您的字符类中包含\,那么您需要使用\\\\ 版本,因为您需要在正则表达式引擎和Java 字符串中两次转义其特殊含义
    2. 您将- 与('-\\]) 一起使用,后者在字符类中用于指定字符范围,例如a-zA-Z。为了逃避它的特殊含义,你需要使用\\-

    【讨论】:

    • 这项工作可以Pattern pattern = Pattern.compile("^[a-zA-Z\300-\3770-9\u0153\346 \u002F.'\\-\\\\]*$"); 吗?写成 Java 字符串时,反斜杠需要四倍转义
    • @JasonSperske \\\\] 很好,以防 OP 想在他的角色类中包含 \。
    • @JasonSperske 如果你想将- 作为一个字符,你可以把它放在最后。如果字符类中后面没有任何内容,则假定它不充当操作符。
    • @Jeff 我听说将- 放在字符类的末尾或开头适用于Java,但这可能不是一个好习惯,因为并非所有语言/正则表达式引擎都接受这种使用方式。所以最好显式转义它的特殊含义。
    • @Jeff 正确。我想把它包括在内,所以我把它放在最后。
    猜你喜欢
    • 2019-07-15
    • 2015-04-02
    • 1970-01-01
    • 2015-06-06
    • 2017-12-09
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    • 1970-01-01
    相关资源
    最近更新 更多