【问题标题】:Match everything that comes before a character, if there is one (Regex)匹配字符之前的所有内容,如果有的话(正则表达式)
【发布时间】:2021-09-23 20:07:00
【问题描述】:

大家晚上好!

我写了一个捕获资源的模式:

X-ray Tracing ID : Root=%{DATA:resource}

在下面的日志摘录中:

(d9be2aec-d683-4d9b-8d3c-428f1f339416) X-ray Tracing ID : Root=1-612dd69a-4b2951db368113005fb367ce 

但是,我正在考虑在日志中出现@之后的附加片段的情况,我不想考虑:

(d9be2aec-d683-4d9b-8d3c-428f1f339416) X-ray Tracing ID : Root=1-612dd69a-4b2951db368113005fb367ce@12345678998765 

这就是我写的 grok 工作的地方:

X-ray Tracing ID : Root=%{DATA:resource}[^@]*

以及如何结合这两种情况?类似的语法,只是如果出现@我们不考虑其余部分,如果出现,如果不出现,则全部考虑?

我是 grok 模式的初学者,所以希望能得到提示。

【问题讨论】:

    标签: regex logstash-grok grok


    【解决方案1】:

    如果您检查 Grok 模式,您将看到 DATA .*?。如果你的模式以此结构结束,它不会匹配任何东西,因为正则表达式末尾的惰性模式永远不会消耗任何文本。

    我建议在这里将除空格和@ 之外的所有字符与(?<resource>[^[:space:]@]+) 匹配,而不是使用DATA 模式:

    X-ray Tracing ID : Root=(?<resource>[^[:space:]@]+)
    

    查看测试截图:

    【讨论】:

    • 感谢 Wiktor,确实,一个好主意,现在想知道如果 @ 结尾出现(并且并不总是出现)我正在寻找一种可以满足的模式这两种情况
    • @Dawid 这实际上并不清楚,我以为您想获取Root= 之后的其余字符。所以,你需要一个自定义模式,X-ray Tracing ID : Root=(?&lt;resource&gt;[^[:space:]@]+)
    猜你喜欢
    • 2015-01-22
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-05
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多