[英]Java regex placing @ in character classes
我正在使用以下代码来评估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());
}
}
但是当我将正则表达式上方的“ @”符号移到字符组的末尾时,如下所示:
[^A-Za-z0-9/._-@]
,出现以下异常:
java.util.regex.PatternSyntaxException: Illegal character range near index 15
[^A-Za-z0-9/._-@]
^
为什么字符组中'@'字符的位置相关,并且如果'@'字符位于结束']'之前,则正则表达式如何导致异常?
这是因为连字符( -
)需要在此处转义。
[^A-Za-z0-9/._\\-@]
在字符类中,可以将连字符作为范围内的第一个或最后一个字符。 如果将连字符放置在其他任何地方,都需要对其进行转义以进行匹配。
问题不是@
,而是连字符( -
)。
在类( []
)中,连字符定义一个范围,例如az
。
在第二种情况下, _
和@
之间的范围当然是无效的,因此是错误的。
如果需要,可以转义连字符来解决此问题: \\\\-
。
-
是字符类中的特殊字符,它指示范围。
因此,您的正则表达式包含无效的_-@
范围。 你需要逃避HTE -
像这样\\-
"[^A-Za-z0-9/.@_\\-]"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.