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

时间:2012-03-27 18:25:15

标签: java regex regex-negation

我正在尝试编写一个正则表达式来检测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

感谢。

2 个答案:

答案 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)