尝试与正则表达式匹配时java.util.regex.PatternSyntaxException

时间:2015-02-12 10:57:12

标签: java regex

当我尝试执行以下代码时

text.matches("[a-zA-Z0-9 !\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~]");

我正在异常

Exception in thread "main" java.util.regex.PatternSyntaxException: Unclosed character class near index 43
[a-zA-Z0-9 !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~]
                                           ^
    at java.util.regex.Pattern.error(Unknown Source)
    at java.util.regex.Pattern.clazz(Unknown Source)
    at java.util.regex.Pattern.sequence(Unknown Source)
    at java.util.regex.Pattern.expr(Unknown Source)
    at java.util.regex.Pattern.compile(Unknown Source)
    at java.util.regex.Pattern.<init>(Unknown Source)
    at java.util.regex.Pattern.compile(Unknown Source)
    at java.util.regex.Pattern.matches(Unknown Source)
    at java.lang.String.matches(Unknown Source)
    at test.G3Utils.checkIsAttribANS(G3Utils.java:47)
    at test.G3Utils.main(G3Utils.java:6)

请帮我解决这个问题

3 个答案:

答案 0 :(得分:2)

您需要转义[字符,就像逃离]字符一样。

所以你的正则表达式的固定版本是:

[a-zA-Z0-9 !\"#$%&'()*+,-./:;<=>?@\\[\\]^_`{|}~]

答案 1 :(得分:1)

在正则表达式的列表中使用文字]时,您应该将其作为第一个字符,否则Parser将无法理解它。但是,Java也接受转义它,请参阅下一段。

对于Java,您需要使用[转义\,但是您需要在Java中将其转义为将其用作文字字符串,因此请将[替换为\\[ }

这将使你的正则表达式工作:

text.matches("[]a-zA-Z0-9 !\"#$%&'()*+,-./:;<=>?@\\[^_`{|}~]");

其他事项请注意,,-.匹配从逗号到点的间隔,如果不是所需的行为,则将-移动到最后一个位置。 (它的工作原理是因为ASCII表顺序是,-.)。

答案 2 :(得分:0)

您可以像这样改进正则表达式:

"[\\w !\"#$%&'()*+,-./:;<=>?@\\[\\]^_`{|}~]"

在这里,您可以利用预定义的角色类\w \w相当于[a-zA-Z0-9]

参考:Java Regular Expressions: Predefined Character Classes