如何使用正则表达式负向lookahead

问题描述:

我试图从文件中使用egrep -o -e获取电子邮件地址,并且遇到了行尾地址的问题。如何使用正则表达式负向lookahead

这里是我的正则表达式:

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

我知道这不会赶上电子邮件地址的每一个变化,但如果地址是在一行的末尾,这是我所得到的:

[email protected][email protected]\ul 

所以我想我会尝试一个消极的向前看,但我不知道如何正确使用它。我在线阅读了一些内容,但我对它的工作原理感到困惑。

这是我已经试过:

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

击失败,event not found: \\[._a

有什么建议?

点代表什么?

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

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

而且,!是bash(历史扩展)中的一个特殊字符。你必须反斜杠才能直接使用它。

+0

它应该匹配电子邮件地址中的点。 '.com'不聪明? –

+0

这对我不起作用...... :('egrep -o -e“(?\!\\ [._ a-zA-Z0-9] + @ [._ a-zA-Z0-9] +。 [._a-zA-Z0-9] +)“〜/ myfile.txt” –

+1

@ code4me:点在正则表达式中是特殊的,它匹配任何东西,使用'\ .'或'[。]'直接匹配点。 – choroba

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

但是,您应该注意,您的grep版本也可能不支持负向预测。在这种情况下,您需要一个更强大的正则表达工具,如perlack

+0

我试过这个'egrep - o -e'(?!\ [._ a-zA-Z0-9] + @ [._ a-zA-Z0-9] +。[._ a-zA-Z0-9] +)'〜/ myfile.txt '但没有运气 –