如何在 java 中使用正则表达式删除 "abcd.efgh@xyz.com" 类型的电子邮件地址的点 (.) 字符?



我试图编写一个正则表达式来检测类型为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)

相关内容

最新更新