Java正则表达式错误:\(不是有效字符

时间:2011-03-10 13:40:00

标签: java regex

我今天使用的是java regexp,发现你不能使用以下正则表达式序列

String pattern = "[a-zA-Z\\s\\.-\\)\\(]*";

如果我使用它会失败并告诉我\(不是有效字符。

但如果我将正则表达式更改为

String pattern = "[[a-zA-Z\\s\\.-]|[\\(\\)]]*";

然后它会起作用。这是regxp引擎中的错误还是我不了解如何使用引擎?

编辑:我的字符串中有一个错误:不应该有2个开始[[,它应该只有一个。现在已经更正了

4 个答案:

答案 0 :(得分:9)

你的正则表达式有两个问题。

  1. 您尚未关闭角色类。

  2. -充当范围运算符,LHS上为.,RHS上为(。但(.之前出现在unicode中,因此导致无效范围。

  3. 要解决问题1,请关闭char类,或者如果您不想在允许的字符中包含[,请删除其中一个[

    要解决问题2,请将-转义为\\-,或将-移至char类的开头或结尾。

    所以你可以使用:

    String pattern = "[a-zA-Z\\s\\.\\-\\)\\(]*";
    

    String pattern = "[a-zA-Z\\s\\.\\)\\(-]*";
    

    String pattern = "[-a-zA-Z\\s\\.\\)\\(]*";
    

答案 1 :(得分:5)

您应该只在字符类的末尾使用短划线-,因为它通常用于显示范围(如a-z中所示)。重新排列:

String pattern = "[[a-zA-Z\\s\\.\\)\\(-]*";

另外,我不认为你必须在括号内转义(.)个字符。

更新:正如其他人指出的那样,您还必须转义java正则表达式字符类中的[

答案 2 :(得分:2)

此处的问题是\.-\)(Java字符串文字中的"\\.-\\)")尝试定义从.)的范围。由于.(U + 002E)的Unicode代码点高于)(U + 0029),因此这是一个错误。

尝试使用此模式,您会看到:[z-a]

正确的解决方案是将短划线-放在角色组的末尾(此时它将失去其特殊含义)或逃避它。

如果不是用于分组,您还需要关闭未闭合的方形括号或将其转义。

此外,在字符组中不需要转义fullstop .

答案 3 :(得分:1)

你必须逃脱破折号并关闭不匹配的方括号。因此,这个正则表达式会导致两个错误:

java.util.regex.PatternSyntaxException: Illegal character range near index 14

因为破折号用于指定范围,而\)显然是无效的范围字符。如果你逃离破折号,那么你可以[[a-zA-Z\s\.\-\)\(]*获得

java.util.regex.PatternSyntaxException: Unclosed character class near index 19

表示您有一个额外的开口方括号,用于指定字符类。我不知道你在这里添加一个额外的括号是什么意思,但要么逃避它,要么删除它将使它成为一个有效的正则表达式。