用于删除除模式之外的所有字符的Java正则表达式

时间:2014-08-28 19:00:32

标签: java regex string email

我有一个包含电子邮件的字符串。它之前和/或之后可能有额外的字符。 输入示例:

a1@b.com
a2@b.com abcd efg
x y z a3@b.com
p q a4@b.com x z
asd[x5@c.net]gh

我想删除多余的字符。

期望的产出:

a1@b.com
a2@b.com
a3@b.com
a4@b.com
x5@c.net

有效字符是a-zA-Z0-9._ 因此,在电子邮件之前和/或之后可能存在无效字符。

我尝试使用此代码来识别它是否是正确的电子邮件(这假设它与空格中的额外字符分开),但我无法替换为所需的字符串(使用s.replaceAll()):< / p>

if (s.matches("(?i).*\\s[a-zA-Z_\\.]+@[a-zA-Z_\\.]+\\.[a-zA-Z_\\.]+.*") ||
    fields[2].matches("(?i).*[a-zA-Z_\\.]+@[a-zA-Z_\\.]+\\.[a-zA-Z_\\.]+\\s.*"))

3 个答案:

答案 0 :(得分:1)

你可以使用java.util.regex.Pattern和java.util.regex.Matcher

此代码将按您的要求执行:

public static void main(String[] args) {
    String[] testList = {"a1@b.com", 
            "a2@b.com abcd efg", 
            "x y z a3@b.com", 
            "p q a4@b.com x z", 
            "asd[a5@b.coom]gh"};

    Pattern EMAIL_PATTERN = Pattern.compile("[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)*(\\.[A-Za-z]{2,})");


    for(String test : testList){
        Matcher m = EMAIL_PATTERN.matcher(test);
        while (m.find()) {
             System.out.println(m.group(0));
        }
    }
}

答案 1 :(得分:0)

鉴于您对有效字符的定义,请尝试:

^.*?([\w.]+@[\w.]+).*$

并替换为捕获组1

答案 2 :(得分:0)

无法验证电子邮件地址。只能验证电子邮件 - 地址 - 外观 - 即使这个任务也非常棘手,因为新的tld超过3个字符。

所以,你最好找到&#34;无效&#34;电子邮件地址(邮件发送将失败),然后错过有效的邮件。

使用

([a-zA-Z0-9!#$%&'*+-/=?^_`{|}~.]+\@(?:[a-zA-Z0-9.-]+|\[[0-9.]+\]))

抓取任何可能是电子邮件地址的内容。

  ([a-zA-Z0-9!#$%&'*+-/=?^_`{|}~.]+\@(?:[a-zA-Z0-9.-]+|\[[0-9.]+\]))

Regular expression visualization

Debuggex Demo