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 { /** *
@
后跟一个
和
以com
abcdefghij@gmail.com
sdksdhkshdsdkabcdefghij123@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为我展示了这种语法。我以前从未见过它。