Regex 贪婪匹配,除非它运行到特定的字符串,然后匹配到特定的组?
我正在尝试使用regex/grok解析logstash中的URL。我已经猜出了大部分的线索,但最后一部分我被卡住了,我发现很难解释: 这是我一直坚持的部分: 在Logstash中,我希望捕获整个字符串并将其转储到名为Regex 贪婪匹配,除非它运行到特定的字符串,然后匹配到特定的组?,regex,pcre,regex-lookarounds,logstash-grok,regex-greedy,Regex,Pcre,Regex Lookarounds,Logstash Grok,Regex Greedy,我正在尝试使用regex/grok解析logstash中的URL。我已经猜出了大部分的线索,但最后一部分我被卡住了,我发现很难解释: 这是我一直坚持的部分: 在Logstash中,我希望捕获整个字符串并将其转储到名为api\u info的字段中,除非它包含字符串&freeText=,在这种情况下,我希望在&freeText=之前的所有内容都进入api\u info字段,以及&freeText=之后的所有内容进入api\u搜索字段。否则,api_搜索字段应为空 以下是我迄今为止/已经尝试过的: (
api\u info
的字段中,除非它包含字符串&freeText=
,在这种情况下,我希望在&freeText=
之前的所有内容都进入api\u info
字段,以及&freeText=
之后的所有内容进入api\u搜索
字段。否则,api_搜索字段应为空
以下是我迄今为止/已经尝试过的:
(?<api_info>.*?)(?=&freeText=)?(:?&freeText=)(?<api_search>.*)?
(?<api_info>.*)((:?&freeText=)(?<api_search>.*))?
请注意,如果空组转换为null,请确保,但您可以使用替代项来匹配字符串的结尾
$
或&freeText=
对于api_搜索组,您可以匹配任何字符0+次
(?<api_info>.+?)(?:&freeText=|$)(?<api_search>.*)
(?如果使用正向前瞻,它将永远不会与第二条消息匹配。因此请使用交替
"((?<api_info>.*)(&freeText=)(?<api_search>.*)?|(?<api_info>.*))"
((?*)(&freeText=)(?*)|(?*))
为什么不简单地用&freeText
拆分字符串,并根据拆分后的值决定api_搜索
"((?<api_info>.*)(&freeText=)(?<api_search>.*)?|(?<api_info>.*))"