如何使用regex负前瞻

如何使用regex负前瞻,regex,grep,negative-lookahead,Regex,Grep,Negative Lookahead,我试图使用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
从文件中获取电子邮件地址,但在一行末尾的地址上遇到了问题

这是我的正则表达式:

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失败,未找到
事件:\\[.\u a


有什么建议吗?

点代表什么

"[._a-zA-Z0-9]+@[._a-zA-Z0-9]+.[._a-zA-Z0-9]+"
                              ^
                             here
它与at符号匹配。如果删除它,则不带前瞻的原始正则表达式将起作用


此外,
是bash(历史扩展)中的一个特殊字符。您必须反斜杠才能按字面意思使用它。

bash中将
插入为历史扩展命令。您应该使用单引号而不是双引号来防止出现这种情况


但是,您应该注意到,您的
grep
版本可能也不支持反向前瞻。在这种情况下,您需要一个更强大的正则表达式工具,如
perl
或。

它应该与电子邮件地址中的点匹配。
.com
不智能?这对我不起作用……:(
egrep-o-e”(?\!\[。\u a-zA-Z0-9]+@[.[U a-zA-Z0-9]+.[U a-zA-Z0-9]+“~/myfile.txt
@code4me:Dot在正则表达式中是特殊的,它匹配任何内容。使用
\.
[.]
以逐字匹配圆点。我根据您和@ExplosionPills建议的组合实现了这一点。我还将
\b
添加到正则表达式的开头和结尾。ThanksI尝试了这个
egrep-o-e'(?!\[。\u a-zA-Z0-9]+.\u a-zA-Z0-9]+..\u a-zA-Z0-9]+.~/myfile.txt
,但运气不好