Java 使用正则表达式过滤文本中带有特定条件的大量电子邮件地址

Java 使用正则表达式过滤文本中带有特定条件的大量电子邮件地址,java,regex,regex-greedy,Java,Regex,Regex Greedy,我正在尝试使用正则表达式,并试图过滤掉一些文本源中嵌入的电子邮件地址。过滤过程将在两个特定条件下进行: 每封电子邮件都以abc开头 常规电子邮件模式,包括一个@后跟一个和 以com 资料来源: sajgvdaskdsdsabcdefghij@gmail.comsdksdhkshdsdkabcdefghij123@gmail.comwdgjkasdsdad Pattern1=“abc[\w\w][@][\w]\.com 代码: public class Test { /** *

我正在尝试使用正则表达式,并试图过滤掉一些文本源中嵌入的电子邮件地址。过滤过程将在两个特定条件下进行:

  • 每封电子邮件都以abc开头

  • 常规电子邮件模式,包括一个
    @
    后跟一个
    和 以
    com

  • 资料来源:

    sajgvdaskdsds
    abcdefghij@gmail.com
    sdksdhkshdsdk
    abcdefghij123@gmail.com
    wdgjkasdsdad

    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为:

    位置:15找到:abcdefghij@gmail.com

    位置:48找到:abcdefghij123@gmail.com

    但是得到:

    位置:15找到: abcdefghij@gmail.comsdksdhkshdsdkabcdefghij123@gmail.com

    如果我使用这种模式2:
    abc[\\w]*[@][\\w]*\\\.com
    那么我就得到了预期的o/p。然而,问题是电子邮件地址可以在
    abc
    之后和
    @
    之前包含非单词字符(例如:
    abcd$efghi$@gmail.com

    因此,Pattern2不能处理非单词字符。因此,我选择了
    [\\w\\w]*
    而不是
    [\\w]*

    我还尝试了模式3:
    abc[\\w\\w][@][\\w]\\.com[^.]
    ,但仍然不起作用


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

    正则表达式操作符在默认情况下是贪婪的,这意味着它们将尽可能多地抓取字符串。
    [\w\w]*
    将抓取所有插入的
    @
    字符,但最后一个字符除外

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

    abc[^@]*@[^.]+\.com
    
    [^@]
    将使用尽可能多的非
    @
    字符。类似地,
    [^.]
    将匹配所有字符,直到第一个点

    或者,您可以使用以下运算符:

    abc.*?@.*?\.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
    限制为更有意义的内容,它仍然有效。

    尝试从左侧部分排除
    '@

    "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
    限制为更有意义的内容,它仍然可以工作。

    在第一个字符类中-
    \\w
    包括所有[a-zA-Z\u 0-9].
    \\W
    只是这个的补充,所以我把它们放在一起就可以匹配任何东西。理想情况下,您可以在这里使用您期望的字符的白名单(
    \n
    可能不允许!),但关键是您肯定不想要@,所以这将为您提供两个匹配项:

    "abc[^@]*[@][\\w]*\\.com"
    
    我建议其他方括号是多余的,因此应该删除,并且第二组应该至少有一个字符。这将给您留下:


    “abc[^@]*@\w+\.com”

    在您的第一个字符类中-
    \\w
    包括所有[a-zA-Z\u 0-9]。
    \\w
    只是这个的补充,所以我把它们放在一起可以匹配任何字符。理想情况下,您应该在这里使用您期望的字符的白名单(
    \n
    可能不允许!),但关键是你肯定不想要@,所以这会给你两个匹配:

    "abc[^@]*[@][\\w]*\\.com"
    
    我建议其他方括号是多余的,因此应该删除,并且第二组应该至少有一个字符。这将给您留下:


    “abc[^@]*@\w+\.com”

    工作得很有魅力!谢谢!!应该用^@和^来简化表达式。非常感谢!:)很高兴它起到了作用。这是我很久以来看到的第一个显示大量努力和研究的正则表达式问题。请继续感谢。我能问一下,有没有这样说的模式:”给我找一个字符串中有n个x的东西?,比如:“11111 Saksda”
    x{n}
    应该这样做你也可以这样做
    x{m,n}
    表示
    x
    介于
    m
    n
    之间的时间工作得很有魅力!谢谢!!应该用^@和^来简化表达式。非常感谢!:)很高兴它能帮上忙。这是我很久以来看到的第一个显示大量努力和研究的正则表达式问题。谢谢。我能问一下,有没有r说这样的话:“给我找一个字符串中有n个x的东西”?比如:“11111 Saksda”
    x{n}
    应该这样做你也可以做
    x{m,n}
    来表示
    x
    m
    n
    之间的时间
    [\\w\\w&&[^]]
    只是一种非常复杂的表达方式,但是+1为我展示了这种语法。我以前从未见过它。