我试图编写一个正则表达式来检测类型为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/和这个网站上的链接像
如何只匹配不包含点的字符串(使用正则表达式)
Java RegEx元字符(.)和普通点?
因此,我将我的模式更改为以下模式,以避免检测到"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"。为什么会发生这种情况?如何编写regex以仅检测"abc@xyz.com'而不是'abcd.efgh@xyz.com"?
此外,我如何编写一个正则表达式来检测电子邮件地址,如"abc@xyz.com'和字符串中的'efg at xyz.com'和'abc(at)xyz(dot)com'。基本上,我将如何在regex中实现OR逻辑,以便在OR(at)处检查@OR?
在下面的一些评论之后,我尝试了以下表达式来获得@平方之前的部分。
Pattern.compile("((([\w]+\.)+[\w]+)|([\w]+))@(\w+)\.com")
Matcher myMatcher = myPattern.matcher(line);
myMatcher.group是什么?当我们有嵌套括号时,如何考虑这些组?
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
forabcd.efgh@xyz.com
abc
null
null
abc
xyz
forabc@xyz.com
谢谢。
您可以在regexp中使用|运算符来检测@ORA:@|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);
}
你的第一个模式需要结合你想要的单词字符而不是点的事实,你现在有单独的,它应该是:
[^\.W]+
这是"非点"one_answers"非文字字符"
所以你有:
Pattern myPattern = Pattern.compile("([^\.W]+)( *)@( *)(\w+)\.com");
要回答第二个问题,您可以在REGEX中使用带有|字符的OR
(@|at)