gpt4 book ai didi

ruby - Ruby RegExp 中的可选命名组

转载 作者:数据小太阳 更新时间:2023-10-29 08:57:10 24 4
gpt4 key购买 nike

我正在使用一个插件来解析发送到 fluentd 的 nginx 日志条目,并尝试对其进行更改,以便它可以选择支持另一个字段。这是用于解析 nginx 日志条目的当前 REGEXP config_set_default :expression, %q{/^(?<remote>[^ ]*) (?<host>[^ ]*) (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^\"]*?)(?: +\S*)?)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)")?$/}

我尝试像这样将新字段添加到 REGEXP - config_set_default :expression, %q{/^(?<remote>[^ ]*) (?<host>[^ ]*) (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^\"]*?)(?: +\S*)?)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)"(?<http_x_forwarded_for>[^ ]*)?)?$/}

这个 REGEXP 可以解析日志条目,无论它是否有新字段,但仍然为新字段创建一个命名组,这使得现有的测试插件中断。

我想知道是否有某种方法可以指示 REGEXP 如果该组的值存在,它应该添加命名组,否则省略该组。

这里有 2 个日志条目的例子,有和没有新字段(分别)-
127.0.0.1 192.168.0.1 - [28/Feb/2013:12:00:00 +0900] "GET / HTTP/1.1" 200 777 "-" "Opera/12.0"
127.0.0.1 192.168.0.1 - [28/Feb/2013:12:00:00 +0900] "GET / HTTP/1.1" 200 777 "-" "Opera/12.0" -

最佳答案

您需要添加 (?:\s+(?<http_x_forwarded_for>\S+))?最后一个字段模式之后的可选非捕获组。这意味着命名的捕获组应该在一个可选的非捕获组中,并且 \s+应该放在它之前,以考虑字段之前的任何 1+ 个空白字符。

使用

^(?<remote>\S*) (?<host>\S*) (?<user>\S*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^"]*?)(?:\s+\S*)?)?" (?<code>\S*) (?<size>\S*)(?: "(?<referer>[^"]*)" "(?<agent>[^"]*)"(?:\s+(?<http_x_forwarded_for>\S+))?)?$

参见 regex demo .

注意我替换了[^ ]\S用正则表达式匹配除空白字符以外的字符更自然。

关于ruby - Ruby RegExp 中的可选命名组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49645316/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com