Java正则表达式在字符类中放置@
我使用下面的代码来计算Java中的正则表达式,效果很好Java正则表达式在字符类中放置@,java,regex,Java,Regex,我使用下面的代码来计算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@resistanc
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/._-@]
^
为什么字符组中“@”字符的位置相关?如果“@”字符在结束“]]之前,正则表达式为什么会导致异常?这是因为需要在此处转义连字符(-
)
[^A-Za-z0-9/._\\-@]
在字符类中,可以将连字符作为范围中的第一个或最后一个字符。如果将连字符放在其他任何地方,则需要将其转义才能匹配。这是因为需要在此处转义连字符(-
)
[^A-Za-z0-9/._\\-@]
在字符类中,可以将连字符作为范围中的第一个或最后一个字符。如果您将连字符放在其他任何需要转义的地方以进行匹配。问题不在于
@
,而在于连字符(-
)
在类([]
)中,连字符定义了一个范围,例如a-z
在第二个实例中,\
和@
之间的范围当然无效,因此出现错误
如果需要,您可以跳过连字符来解决此问题:
\-
问题不在于@
,而在于连字符(-
)
在类([]
)中,连字符定义了一个范围,例如a-z
在第二个实例中,\
和@
之间的范围当然无效,因此出现错误
如果需要,可以转义连字符以解决此问题:
\-
-
是字符类中的特殊字符,它表示一个范围
因此,您的正则表达式包含无效的范围-@
。你需要逃出hte-
,就像这样\-
:
"[^A-Za-z0-9/.@_\\-]"
-
是字符类中的一个特殊字符,它表示一个范围
因此,您的正则表达式包含无效的范围-@
。你需要逃出hte-
,就像这样\-
:
"[^A-Za-z0-9/.@_\\-]"
谢谢你的帮助。我尝试过转义连字符来修复异常,但是现在所有包含连字符的测试字符串的单元测试都失败了,比如“johnconnor”。我已经尝试了以下两个正则表达式:[^A-Za-z0-9/-/.\u@]和[^A-Za-z0-9/-/.\u@]。不过,针对“john.connor3”等测试字符串的单元测试正在运行。还有什么我遗漏的吗?@rexford我不能从你发布的信息判断,你需要将一些具有这种
模式的单元测试发布到另一个问题中,因为范围不同。另一方面,我建议首先检查大量关于使用正则表达式解析电子邮件地址的文献(一般和非一般)。@rexford,你的评论中有你的转义序列背景词,[^A-Za-z0-9/\\\\-@]
@hwnd:这是拼图中的最后一块。现在,一切都很好!谢谢你们所有人的帮助和耐心…谢谢你们的帮助。我尝试过转义连字符来修复异常,但是现在所有包含连字符的测试字符串的单元测试都失败了,比如“johnconnor”。我已经尝试了以下两个正则表达式:[^A-Za-z0-9/-/.\u@]和[^A-Za-z0-9/-/.\u@]。不过,针对“john.connor3”等测试字符串的单元测试正在运行。还有什么我遗漏的吗?@rexford我不能从你发布的信息判断,你需要将一些具有这种模式的单元测试发布到另一个问题中,因为范围不同。另一方面,我建议首先检查大量关于使用正则表达式解析电子邮件地址的文献(一般和非一般)。@rexford,你的评论中有你的转义序列背景词,[^A-Za-z0-9/\\\\-@]
@hwnd:这是拼图中的最后一块。现在,一切都很好!谢谢大家的帮助和耐心。。。