我试过这段代码:
public static void main(String[] args) throws Exception {
String regexp = "[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)*(\\.)[a-zA-Z]+";
String text1 = "my.name-here@my.domain-here.ext";
String text2 = "my.name-here@m@y.domain-here.ext";
String text3 = "@domain-here.ext";
String text4 = "my.name-here@";
String text5 = "my.name-here@domain-here";
String text6 = ".my.name-here@my.domain-here.ext";
String text7 = "my.name-here.@my.domain-here.ext";
String text8 = "my.name-here@.my.domain-here.ext";
String text9 = "my.name-here@my.domain-here.ext.";
String text10 = "my.na me-here@my.domain-here.ext";
String text11 = "my.name-here@my.dom ain-here.ext";
String text12 = "my..name-here@my.domain-here.ext";
String text13 = "my.name-here@my..domain-here.ext";
RE re = new RE(regexp);
System.out.println(re.match(text1));
System.out.println(re.match(text2));
System.out.println(re.match(text3));
System.out.println(re.match(text4));
System.out.println(re.match(text5));
System.out.println(re.match(text6));
System.out.println(re.match(text7));
System.out.println(re.match(text8));
System.out.println(re.match(text9));
System.out.println(re.match(text10));
System.out.println(re.match(text11));
System.out.println(re.match(text12));
System.out.println(re.match(text13));
System.out.println(Pattern.matches(regexp, text1));
System.out.println(Pattern.matches(regexp, text2));
System.out.println(Pattern.matches(regexp, text3));
System.out.println(Pattern.matches(regexp, text4));
System.out.println(Pattern.matches(regexp, text5));
System.out.println(Pattern.matches(regexp, text6));
System.out.println(Pattern.matches(regexp, text7));
System.out.println(Pattern.matches(regexp, text8));
System.out.println(Pattern.matches(regexp, text9));
System.out.println(Pattern.matches(regexp, text10));
System.out.println(Pattern.matches(regexp, text11));
System.out.println(Pattern.matches(regexp, text12));
System.out.println(Pattern.matches(regexp, text13));
}
只有第一个必须正确,但...... org.apache.regexp.RE
做错了。有解决方案吗非常感谢。我必须以org.apache.regexp.RE
强制执行。
更新:模式匹配正确(除了第一个之外都是假的),RE说有些字符串是真的,但它们不是。
答案 0 :(得分:0)
你的表达式没有声明它必须匹配整个输入,因此我假设在my.name-here@m@y.domain-here.ext
Apache Regexp匹配m@y.domain-here.ext
部分(尽管我不太了解Apache RegexP并且它已经退役,顺便说一句。
用^和$包装正则表达式,使其与整个输入匹配。
来自Matcher#matches()
上的JavaDoc(Pattern.matches(...)
调用该方法,从JavaDoc可以看到):
尝试将整个区域与模式匹配
编辑
我刚刚在RegexP小程序中测试了你的表达式,看起来你必须在你的角色类中逃避文字-
(这无论如何都是好的做法)。这个表达似乎在RegexP中起作用:
"^[\\w\\-]+(\\.[\\w\\-]+)*@[\\w\\-]+(\\.[\\w\\-]+)*(\\.)[a-zA-Z]+$"
顺便说一下,你可能想要添加非捕获组来优化表达式,即代替(\\.)
你写(?:\\.)
等。
答案 1 :(得分:0)
我想在这里提供旁注。可悲的是,电子邮件正则表达式几乎普遍错误。这是标准所描述的电子邮件地址的有效正则表达式。 http://www.ex-parrot.com/pdw/Mail-RFC822-Address.html
我注意到"hi@dog"@example.com
是一个有效的电子邮件地址,由于正则表达式中只有一个@
,因此无法在许多网站上使用。