Java regexp错误:\(不是有效字符

Mar*_*hin 4 java regex

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

String pattern = "[a-zA-Z\\s\\.-\\)\\(]*";
Run Code Online (Sandbox Code Playgroud)

如果我使用它它将失败并告诉我\(不是一个有效的字符.

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

String pattern = "[[a-zA-Z\\s\\.-]|[\\(\\)]]*";
Run Code Online (Sandbox Code Playgroud)

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

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

cod*_*ict 9

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

  1. 你还没有关闭角色类.

  2. -充当范围内运营商.在LHS和(在RHS.但是在unicode (之前.,所以这会导致无效范围.

要修复问题1,请关闭char类,或者如果您打算不包含[允许的字符,请删除其中一个[.

要修复问题2,要么转义为-as ,要么\\-移动-到char类的开头或结尾.

所以你可以使用:

String pattern = "[a-zA-Z\\s\\.\\-\\)\\(]*";
Run Code Online (Sandbox Code Playgroud)

要么

String pattern = "[a-zA-Z\\s\\.\\)\\(-]*";
Run Code Online (Sandbox Code Playgroud)

要么

String pattern = "[-a-zA-Z\\s\\.\\)\\(]*";
Run Code Online (Sandbox Code Playgroud)


Tim*_*Tim 5

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

String pattern = "[[a-zA-Z\\s\\.\\)\\(-]*";
Run Code Online (Sandbox Code Playgroud)

另外,我认为你不必转义(.)括号内的字符.

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