如何使用正则表达式的负向先行断言

3

我将尝试使用egrep -o -e从文件中获取电子邮件地址,但是在行末的地址方面遇到了一些问题。

以下是我的正则表达式:

egrep -o -e "[._a-zA-Z0-9]+@[._a-zA-Z0-9]+.[._a-zA-Z0-9]+" ~/myfile.txt

我知道这种方法不能匹配所有形式的电子邮件地址,但如果该地址位于行末,我会得到以下结果:

user@_12345@myemail.com\ul

我想尝试使用负向先行断言,但是我不知道如何正确使用它。我在网上看了一些东西,但是它的工作原理让我感到困惑。

这是我尝试过的:

egrep -o -e "(?!\\[._a-zA-Z0-9]+@[._a-zA-Z0-9]+.[._a-zA-Z0-9]+)" ~/myfile.txt

Bash报错:事件未找到:\\[._a

有什么建议吗?

2个回答

4

在bash中,!被解释为历史扩展命令。为了防止这种情况发生,应该使用单引号而不是双引号。

但是请注意,负向先行断言可能不被您的版本的grep支持。如果是这种情况,您需要一个更强大的正则表达式工具,如perlack


我尝试过这个命令egrep -o -e '(?!\[._a-zA-Z0-9]+@[._a-zA-Z0-9]+.[._a-zA-Z0-9]+)' ~/myfile.txt,但没有成功。 - undefined

2
“.”点号代表什么?
"[._a-zA-Z0-9]+@[._a-zA-Z0-9]+.[._a-zA-Z0-9]+"
                              ^
                             here

它匹配“@”符号。如果您删除它,您的原始正则表达式将不使用前瞻也能工作。

此外,在bash中,“!”是一个特殊字符(历史扩展)。您必须反斜杠转义它以字面意义使用。


它本应匹配电子邮件地址中的点。.com不智能吗? - undefined
这对我没用... :( egrep -o -e "(?\!\\[._a-zA-Z0-9]+@[._a-zA-Z0-9]+.[._a-zA-Z0-9]+)" ~/myfile.txt - undefined
1
@code4me:在正则表达式中,点号是特殊字符,它可以匹配任意字符。要匹配字面上的点号,请使用\.[.] - undefined
根据你和@ExplosionPills建议的结合,我成功解决了这个问题。我还在正则表达式的开头和结尾添加了\b。谢谢! - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接