使用正则表达式过滤具有某些特定条件的文本中的一堆电子邮件地址

Using regex to filter bunch of email addresses in text with some specific conditions

我正在试验正则表达式,并试图过滤掉嵌入某些文本源中的一堆电子邮件地址。过滤过程将基于两个特定条件:

  1. 每封电子邮件都以 abc

  2. 开头
  3. 常规电子邮件模式,其中包括 @ 后跟 . 和 具体以 com

  4. 结尾

来源:

sajgvdaskdsdsdsabcdefghij@gmail.comsdksdhkshdsdkabcdefghij123@gmail.comwdgjkasdsdad

Pattern1 = "abc[\w\W][@][\w]\.com

代码:

public class Test {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args)
    {
        boolean found = false;
        String source = "sajgvdaskdsdsdsabcdefghij@gmail.comsdksdhkshdsdkabcdefghij123@gmail.comwdgjkasdsdad";


        String pattern1 = "abc[\w\W]*[@][\w]*\.com";

        Pattern p1 = Pattern.compile(pattern1);
        Matcher m1 = p1.matcher(source);
        System.out.println("Source:\t" + source);
        System.out.println("Exprsn:\t" + m1.pattern());
        while (m1.find())
        {
            found = true;
            System.out.println("Pos: " + m1.start() + "\tFound: " + m1.group());
        }
        System.out.println();
        if(!found)
        {
            System.out.println("Nothing found!");
        }

    }

}

我预计 o/p 为:

Pos: 15 Found: abcdefghij@gmail.com

Pos: 48 Found: abcdefghij123@gmail.com

但得到:

Pos: 15 Found: abcdefghij@gmail.comsdksdhkshdsdkabcdefghij123@gmail.com

如果我使用这个 Pattern2: abc[\w]*[@][\w]*\.com 那么我得到预期的 o/p。但是,电子邮件地址可以在 abc 之后和 @ 之前包含非单词字符。 (例如:abcd$efghi$@gmail.com)。

因此 Pattern2 不适用于非单词字符。所以,我选择了 [\w\W]* 而不是 [\w]*

我也试过 Pattern3: abc[\w\W][@][\w]\.com[^.] 但还是不行。

请帮帮我,我哪里做错了?

默认情况下,正则表达式运算符是贪婪的,这意味着它们将尽可能多地获取字符串。 [\w\W]* 将抓取除最后一个字符之外的所有中间 @ 个字符。

要么使用不情愿的运算符形式(例如 *? 而不是 *),或者只是简化表达式:

abc[^@]*@[^.]+\.com

[^@] 将尽可能多地获取不是 @ 的字符。同样 [^.] 将匹配所有内容,直到第一个点。

或者,您可以使用不情愿的运算符:

abc.*?@.*?\.com

尝试从左侧部分中排除 '@'

"abc[\w\W&&[^@]]+@[\w]+\.com"

然后在下面输入:

"sajgvdasabcd$efghi$@gmail.comkdsd" + 
"sdsabcdefghij@gmail.comsdksdhks" + 
"hdsdkabcdefghij123@gmail.comwdgjkasdsdad"

它匹配:

abcd$efghi$@gmail.com
abcdefghij@gmail.com
abcdefghij123@gmail.com

正则表达式中的 [foo&&[^bar]] 语法表示:包括所有 foo,但排除所有 bar.


编辑:模式[\w\W&&[^@]] 有点荒谬,因为它与[^@] 相同。但是,如果您想将 \w\W 限制为更有意义的内容,它仍然有效。

在您的第一个字符中 class - \w 包括所有 word-characters、[a-zA-Z_0-9]。 \W就是这个的补码,所以我把它们放在一起可以匹配任何东西。理想情况下,你会在这里使用你期望的字符的白名单(\n 可能是不允许的!),但关键是你绝对不想要 @,所以这会给你两个匹配:

"abc[^@]*[@][\w]*\.com"

我建议其他方括号是多余的,因此应该删除,并且第二组确实应该至少有一个字符。这会给你留下:

"abc[^@]*@\w+\.com"