【问题标题】:How to use regex negative lookahead如何使用正则表达式负前瞻
【发布时间】:2013-07-22 15:23:23
【问题描述】:

我正在尝试从使用 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

有什么建议吗?

【问题讨论】:

    标签: regex grep negative-lookahead


    【解决方案1】:

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

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

    【讨论】:

    • 我试过这个egrep -o -e '(?!\[._a-zA-Z0-9]+@[._a-zA-Z0-9]+.[._a-zA-Z0-9]+)' ~/myfile.txt 但没有运气
    【解决方案2】:

    点代表什么?

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

    它与 at 符号匹配。如果您删除它,您的原始正则表达式没有前瞻将起作用。

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

    【讨论】:

    • 它应该与电子邮件地址中的点匹配。 .com不聪明?
    • 这对我不起作用... :( egrep -o -e "(?\!\\[._a-zA-Z0-9]+@[._a-zA-Z0-9]+.[._a-zA-Z0-9]+)" ~/myfile.txt
    • @code4me:点在正则表达式中很特殊,它匹配任何东西。使用\.[.] 从字面上匹配点。
    • 我根据您和@ExplosionPills 的建议来实现这一点。我还在正则表达式的开头和结尾添加了\b。谢谢
    猜你喜欢
    • 2021-10-11
    • 2011-10-14
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多