Java 如何使用正则表达式删除“”类型电子邮件地址的点(.)字符;abcd。efgh@xyz.com&引用;在爪哇?

Java 如何使用正则表达式删除“”类型电子邮件地址的点(.)字符;abcd。efgh@xyz.com&引用;在爪哇?,java,regex,regex-negation,Java,Regex,Regex Negation,我正试图编写一个正则表达式来检测这种类型的电子邮件地址'abc@xyz.com“在java中。我想出了一个简单的模式 String line = // my line containing email address Pattern myPattern = Pattern.compile("()(\\w+)( *)@( *)(\\w+)\\.com"); Matcher myMatcher = myPattern.matcher(line); 但是,这也会检测到“abcd”类型的电子邮件地址。

我正试图编写一个正则表达式来检测这种类型的电子邮件地址'abc@xyz.com“在java中。我想出了一个简单的模式

String line = // my line containing email address
Pattern myPattern = Pattern.compile("()(\\w+)( *)@( *)(\\w+)\\.com");
Matcher myMatcher = myPattern.matcher(line);
但是,这也会检测到“abcd”类型的电子邮件地址。efgh@xyz.com'. 我在这个网站上浏览了很多链接

因此,我将我的模式更改为以下,以避免检测到'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“,我的字符串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中实现或逻辑来执行诸如检查@或at或(at)之类的操作

在下面的一些评论之后,我尝试使用下面的表达式来获得@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


谢谢

您可以在regexp中使用|运算符来检测@ORAT:@|或|(at)。
通过在模式开头使用“^”,可以避免电子邮件地址中出现点:
试试这个:

Pattern myPattern=Pattern.compile(“^(\\w+)\\s*(@|at\\(at\)\\s*(\\w+)\(\\w+)”);
Matcher myMatcher=myPattern.Matcher(行);
if(myMatcher.matches())
{
字符串mail=myMatcher.group(1)+“@”+myMatcher.group(3)+“+myMatcher.group(4);
System.out.println(邮件);
}

您的第一个模式需要结合您想要的是单词字符而不是点的事实,您当前单独拥有它,它应该是:

[^\\.\W]+
这是“非点”和“非文字字符”

所以你有:

Pattern myPattern = Pattern.compile("([^\\.\W]+)( *)@( *)(\\w+)\\.com");
要回答第二个问题,可以在正则表达式中使用或加上|字符

(@|at)

为什么在
@
前后允许空白?这在电子邮件地址中无效。为什么要检测以“me(at)example(dot)com”格式写入的电子邮件地址?如果有人写这封信,他们已经尽力避免被机器解析。@Jim我留下空白来检测像“abc@xyz.com”这样写的电子邮件地址,因为它们不容易被挖掘。@Andrew-我正在写一些东西来阅读这些地址,这是我所学课程的一部分。看起来很可疑,我正在处理大学提供的本地存储的html文件,而不是在互联网上挖掘数据。你可以猜到如何修改该模式以匹配***com:)该模式与任何邮件地址都不匹配。可能是因为^?删除^后,它匹配了许多其他子字符串,如public@ions.htmhow“不工作部分”在这里起作用吗?[^\\.\W]+在我将其更改为[^\\.\\W]+之前不会编译,这似乎可以否定abc@xyz.com并仅返回@xyz.com
(@|at)