我试图编写一个正则表达式来检测java中的类型'abc@xyz.com'的电子邮件地址。我想出了一个简单的模式。
String line = // my line containing email address
Pattern myPattern = Pattern.compile("()(\\w+)( *)@( *)(\\w+)\\.com");
Matcher myMatcher = myPattern.matcher(line);但是,这也会检测到类型为“abcd.efgh@xyz.com”的电子邮件地址。
我经历了http://www.regular-expressions.info/和这个网站上的链接
How to match only strings that do not contain a dot (using regular expressions)
Java RegEx meta character (.) and ordinary dot?
所以我改变了我的模式,以避免检测'efgh@xyz.com'
Pattern myPattern = Pattern.compile("([^\\.])(\\w+)( *)@( *)(\\w+)\\.com");
Matcher myMatcher = myPattern.matcher(line);
String mailid = myMatcher.group(2) + "@" + myMatcher.group(5) + ".com";如果字符串'line'包含地址'abcd.efgh@xyz.com',则我的String mailid将返回'fgh@yyz.com'。为什么会发生?如何编写正则表达式以仅检测'abc@xyz.com'而不是'abcd.efgh@xyz.com'?
另外我该如何编写一个正则表达式来检测电子邮件地址,比如“abc@xyz.com”和“xyz.com上的efg”以及字符串中的“abc(at)xyz(dot)com”。基本上,我会如何在正则表达式中执行OR逻辑来执行诸如在OR(at)处检查@ OR的操作?
在下面的一些评论之后,我尝试了下面的表达式来获取@摆开之前的部分。
Pattern.compile("((([\\w]+\\.)+[\\w]+)|([\\w]+))@(\\w+)\\.com")
Matcher myMatcher = myPattern.matcher(line);myMatcher.groups会是什么?当我们有嵌套括号时,这些组是如何考虑的?
System.out.println(myMatcher.group(1));
System.out.println(myMatcher.group(2));
System.out.println(myMatcher.group(3));
System.out.println(myMatcher.group(4));
System.out.println(myMatcher.group(5));输出就像
abcd.efgh
abcd.efgh
abcd.
null
xyz为abcd.efgh@xyz.com
abc
null
null
abc
xyz为abc@xyz.com
谢谢。