除非匹配到特定的字符串,否则贪心匹配,然后匹配特定的组?

时间:2019-07-17 17:54:47

标签: regex pcre regex-lookarounds logstash-grok regex-greedy

我正在尝试使用正则表达式/ grok解析logstash中的URL。我已经弄清楚了大部分字符串,但是我停留在最后一部分,我发现很难解释:

这是我坚持的部分:

在Logstash中,我想捕获整个字符串并将其转储到名为api_info的字段中,除非它包含字符串&freeText=,在这种情况下,我希望所有内容直到{{1} }进入&freeText=字段,api_info之后的所有内容都进入&freeText=字段。否则,api_search字段应为null。

这是我到目前为止/已经尝试的:

api_search

输入字符串: (?<api_info>.*?)(?=&freeText=)?(:?&freeText=)(?<api_search>.*)? (?<api_info>.*)((:?&freeText=)(?<api_search>.*))?

预期的输入/输出:

womens%7cshoes%ctrainer&pageSize=60&freeText=shoes30

2 个答案:

答案 0 :(得分:2)

请注意是否将一个空组转换为null,但是您可以使用替代方式来匹配字符串$&freeText=的结尾

对于api_search组,您可以匹配任何char 0次以上。

(?<api_info>.+?)(?:&freeText=|$)(?<api_search>.*)

说明

  • (?<api_info>.+?)api_info,匹配除换行符1次以上以外的所有字符
  • (?:&freeText=|$)匹配&freeText=或断言字符串的结尾
  • (?<api_search>.*)api_search,匹配除换行符0次以上以外的所有字符

Regex demo

答案 1 :(得分:0)

如果您使用正向前瞻,则永远不会匹配第二条消息。所以要使用交替

"((?<api_info>.*)(&freeText=)(?<api_search>.*)?|(?<api_info>.*))"