【问题标题】:Regex Match word if string doesn't contain another word如果字符串不包含另一个单词,则正则表达式匹配单词
【发布时间】:2015-08-19 07:50:14
【问题描述】:

我正在寻找一个 PCRE 正则表达式,它将匹配某些进程,但前提是该进程不包含特定单词。

如果字符串包含“udp”,则 REGEX 应该匹配,但如果“vpn”一词出现在字符串中的任何位置,则不匹配。

Example:
    /root/sumcommand -x -y udp 
    MATCH 

    /root/sumcommand VPN udp 12 4 2
    NO MATCH

    /root/sumcommand -x -y udp VPN 2 4 52
    NO MATCH

    /root/sumcommand udp ocean tools 1 5 2
    MATCH

因此,如果所述字符串不包含单词“vpn”,它将始终匹配出现“udp”的位置。怎么做呢?

【问题讨论】:

    标签: regex string pcre


    【解决方案1】:

    您可以尝试以下基于环视的正则表达式。

    (?i)^(?!.*\bvpn\b).*\budp\b.*$
    

    DEMO

    【讨论】:

    • 这太棒了!不过,我唯一的问题是,如果“vpn”是较长单词的一部分,它会找到匹配项,我真的很想避免这种情况。例如。 /usr/sbin/openvpn --daemon --writepid /var/run/openvpn/tunnel1-udp.pid --cd /etc/openvpn --config tunnel1-udp.conf
    • 我将您的正则表达式更新为(?i)^(?!.*vpn\b).*\budp\b.*$,这样我也可以找到以 VPN 结尾的单词,这正是我所需要的。没有你的回答,我不会得到那个,谢谢!
    【解决方案2】:

    您可以使用grep 轻松实现:

    grep "\budp\b" | grep -v "\bVPN\b"
    

    【讨论】:

    • 不幸的是,我只需要通过 PCRE 正则表达式操作来完成此操作。
    猜你喜欢
    • 1970-01-01
    • 2021-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-02
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    相关资源
    最近更新 更多