【问题标题】:Java regex for removing all characters except a pattern用于删除除模式之外的所有字符的 Java 正则表达式
【发布时间】:2014-08-28 19:00:32
【问题描述】:

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

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()):

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.*"))

【问题讨论】:

  • 阅读this
  • 不要使用matchesreplaceAll。相反,设置一个Matcher,使用find(它将在字符串中的任何位置找到一个模式),并使用group(0) 返回它找到的字符串。告诉它返回匹配的字符串比告诉它删除不匹配的字符要容易得多。
  • 有效字符为a-zA-Z0-9._ ...您的正则表达式如何匹配所需输出中电子邮件地址中的12345??
  • 有效字符为 a-zA-Z0-9._ 已编辑。
  • 你最好使用这个正则表达式:\S@\S 你的正则表达式会丢失大量有效的电子邮件地址。电子邮件地址中允许使用大量有效字符。

标签: java regex string email


【解决方案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));
        }
    }
}

【讨论】:

    【解决方案2】:

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

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

    并替换为捕获组 1

    【讨论】:

      【解决方案3】:

      无法验证电子邮件地址。只能验证 email-adress-like-appearence - 由于新的 tld 包含超过 3 个字符,因此这项任务也非常棘手。

      因此,您最好先找到“无效”的电子邮件地址(邮件发送会失败),然后再找一个有效的。

      使用

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

      抓取任何可能是电子邮件地址的东西。

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

      Debuggex Demo

      【讨论】:

        猜你喜欢
        • 2016-04-03
        • 1970-01-01
        • 2011-09-08
        • 2011-10-16
        • 2016-10-23
        • 2017-08-24
        • 2019-01-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多