我今天使用的是java regexp,发现你不能使用以下正则表达式序列
String pattern = "[a-zA-Z\\s\\.-\\)\\(]*";
如果我使用它会失败并告诉我\(不是有效字符。
但如果我将正则表达式更改为
String pattern = "[[a-zA-Z\\s\\.-]|[\\(\\)]]*";
然后它会起作用。这是regxp引擎中的错误还是我不了解如何使用引擎?
编辑:我的字符串中有一个错误:不应该有2个开始[[,它应该只有一个。现在已经更正了
答案 0 :(得分:9)
你的正则表达式有两个问题。
您尚未关闭角色类。
-
充当范围运算符,LHS上为.
,RHS上为(
。但(
在.
之前出现在unicode中,因此导致无效范围。
要解决问题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
表示您有一个额外的开口方括号,用于指定字符类。我不知道你在这里添加一个额外的括号是什么意思,但要么逃避它,要么删除它将使它成为一个有效的正则表达式。