如何使用正则表达式负向前瞻

时间:2013-07-22 15:23:24

标签: 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 "(?!\\[._a-zA-Z0-9]+@[._a-zA-Z0-9]+.[._a-zA-Z0-9]+)" ~/myfile.txt

Bash因event not found: \\[._a

而失败

有什么建议吗?

2 个答案:

答案 0 :(得分:4)

{b}中正在插入!作为历史扩展命令。您应该使用单引号而不是双引号来阻止这种情况。

但是,您应该注意,您的grep版本可能也不支持否定前瞻。在这种情况下,您需要更强大的正则表达式工具,例如perlack

答案 1 :(得分:2)

点代表什么?

"[._a-zA-Z0-9]+@[._a-zA-Z0-9]+.[._a-zA-Z0-9]+"
                              ^
                             here

匹配at符号。如果你删除它,你的原始正则表达式没有预测将起作用。

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