我正在使用以下代码来评估Java中的正则表达式,它的工作正常。
public class RegExTest {
public RegExTest() {
}
public static void main(String[] args) {
Pattern pattern = Pattern.compile("[^A-Za-z0-9/.@_-]");
Matcher matcher = pattern.matcher("john.connor3@resistance-aloha.net");
System.out.println(matcher.find());
}
}
但是当我将regexp上方的'@'符号移到字符组的末尾时,就像在
中一样[^A-Za-z0-9/._-@]
,我得到以下异常:
java.util.regex.PatternSyntaxException: Illegal character range near index 15
[^A-Za-z0-9/._-@]
^
为什么字符组中'@'字符的位置是相关的,如果'@'字符在结束']'之前出现,正则表达式如何导致异常?
答案 0 :(得分:2)
这是因为连字符(-
)需要在这里转义。
[^A-Za-z0-9/._\\-@]
在字符类中,您可以将连字符设置为范围中的第一个或最后一个字符。如果您将连字符放在其他任何地方,您需要将其转义以便匹配。
答案 1 :(得分:2)
这不是@
问题,而是连字符(-
)。
在类([]
)中,连字符定义范围,例如a-z
。
在您的第二个实例中,_
和@
之间的范围当然无效,因此错误。
如果您需要:\\-
,则可以转义连字符以解决此问题。
答案 2 :(得分:1)
-
是字符类中的特殊字符,表示范围。
因此,您的正则表达式包含无效的范围_-@
。你需要逃避-
,\-
:
"[^A-Za-z0-9/.@_\\-]"