我正在尝试编写一个正则表达式来检测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";
如果String'line'包含地址'abcd.efgh@xyz.com',我的String mailid将返回'fgh@yyz.com'。为什么会这样?如何编写正则表达式以仅检测'abc@xyz.com'而不是'abcd.efgh@xyz.com'?
另外,我如何编写单个正则表达式来检测电子邮件地址,如'abc@xyz.com'和'efg at xyz.com'和'abc(at)xyz(dot)com'来自字符串。基本上我如何在regex中实现OR逻辑,以便在OR(at)处检查@ OR?
在下面的一些评论之后,我尝试使用以下表达式来获取@ squared之前的部分。
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
感谢。
答案 0 :(得分:0)
你可以使用|你的regexp中的运算符检测@ORAT:@ | OR |(at)。
您可以通过在模式的开头使用^来避免在电子邮件地址中使用点:
试试这个:
Pattern myPattern = Pattern.compile("^(\\w+)\\s*(@|at|\\(at\\))\\s*(\\w+)\\.(\\w+)");
Matcher myMatcher = myPattern.matcher(line);
if (myMatcher.matches())
{
String mail = myMatcher.group(1) + "@" + myMatcher.group(3) + "." +myMatcher.group(4);
System.out.println(mail);
}
答案 1 :(得分:0)
你的第一个模式需要结合你想要单词字符而非点数的事实,你现在单独使用它,它应该是:
[^\\.\W]+
这是'不是点'和'不是字符'
所以你有:
Pattern myPattern = Pattern.compile("([^\\.\W]+)( *)@( *)(\\w+)\\.com");
要回答第二个问题,您可以在REGEX中使用OR作为|字符
(@|at)