【问题标题】:Regular expression, match anything but these strings正则表达式,匹配除这些字符串之外的任何内容
【发布时间】:2016-05-05 16:54:06
【问题描述】:

在 Splunk 中,我有许多用于从 uri 词干中提取值的字段提取。我有一些匹配特定模式的,我现在想要另一个匹配除这些之外的任何东西的正则表达式。

^/SiteName/[^/]*/(?<a_request_type>((?!Process)|(?!process)|(?!Assets)|(?!assets))[^/]+)

上面的正则表达式是我目前所拥有的。我期待负前瞻阻止它匹配流程、流程、资产或资产。然而,这些前瞻之后的 [^/]+ 似乎可以继续匹配这些字符串。导致这个正则表达式有时会覆盖我为接受这些字符串而编写的其他正则表达式

让正则表达式匹配任何字符串的正确语法是什么,除了否定前瞻中指定的字符串?

谢谢!

【问题讨论】:

    标签: regex regex-negation splunk negative-lookahead


    【解决方案1】:

    负前瞻不消耗任何正在搜索的字符串。当您需要多个负前瞻时,无需使用| (OR) 将它们分开。试试这个:

    ^/SiteName/[^/]*/(?<a_request_type>((?![Pp]rocess)(?![Aa]ssets))[^/]+)
    

    请注意,我已将您的前瞻([Pp]rocess[Aa]ssets)组合在一起,以使正则表达式更简洁。

    Live test.

    【讨论】:

    • 我知道,在你发布后 3 分钟内我无法标记它。还有 5 秒 ;)
    • 我认为你可以进一步减少到(?![Pp]rocess|[Aa]ssets)。 @大辉\b(?:(?!foo)|(?!bar))\w+can still be foo or bar。但是\b(?!foo|bar)\w+cannot be either。这是一个逻辑错误。
    • 是的,所以它不匹配一个,并且会匹配下一个,我明白了。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    • 1970-01-01
    相关资源
    最近更新 更多