如何使用正则表达式负向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(历史扩展)中的一个特殊字符。你必须反斜杠才能直接使用它。
答
!
被作为历史扩展命令插入到bash中。您应该使用单引号而不是双引号来防止这种情况。
但是,您应该注意,您的grep
版本也可能不支持负向预测。在这种情况下,您需要一个更强大的正则表达工具,如perl
或ack
。
+0
我试过这个'egrep - o -e'(?!\ [._ a-zA-Z0-9] + @ [._ a-zA-Z0-9] +。[._ a-zA-Z0-9] +)'〜/ myfile.txt '但没有运气 –
它应该匹配电子邮件地址中的点。 '.com'不聪明? –
这对我不起作用...... :('egrep -o -e“(?\!\\ [._ a-zA-Z0-9] + @ [._ a-zA-Z0-9] +。 [._a-zA-Z0-9] +)“〜/ myfile.txt” –
@ code4me:点在正则表达式中是特殊的,它匹配任何东西,使用'\ .'或'[。]'直接匹配点。 – choroba