我正在尝试使用正则表达式/ 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
答案 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次以上以外的所有字符答案 1 :(得分:0)
如果您使用正向前瞻,则永远不会匹配第二条消息。所以要使用交替
"((?<api_info>.*)(&freeText=)(?<api_search>.*)?|(?<api_info>.*))"