regex 如何在正则表达式中匹配双引号直到字符串的结尾?

rkkpypqq  于 2023-06-07  发布在  其他
关注(0)|答案(1)|浏览(244)

我正在尝试从日志消息中提取子字符串,通常是这样的日志条目:
time="2023-06-01T00:05:30Z" level=debug msg="a foo is printing something" at=foobar
但是当消息太长时,它将被截断,如下所示:
time="2023-06-01T00:05:30Z" level=debug msg="This is a pretty long message
为了提取msg字段,我想使用一个正则表达式,它从第一个双引号开始匹配,直到它看到双引号,或者到达字符串的结尾。
我尝试了msg=\"(.*)(\"|$),但它不像预期的那样工作。谢谢!

c2e8gylq

c2e8gylq1#

这将是一个很好的look aheads用例,因为这是您自然地定义字符串何时结束的方式。因为你想要字符串的结尾($)或双引号(")-但无论哪一个先出现,你都可以使用这样的东西:

msg="(.*?)(?="|$)

其中捕获组是msg字段的内容。Chris Maurer的答案非常重要--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------vs. * 使行为懒惰//尽快停止。否则,它将默认继续到行尾。但是,如果您要查看的行很多,则需要将其设置为多行标记的正则表达式(这很慢),或者添加行结束检查而不是字符串结束检查。它看起来像这样:

msg="(.*?)(?="|\n|$)

检查Regex101,它看起来与两种情况都匹配。祝你好运!不过,为了让你重新认识到这一点,Chris一针见血地指出--你不仅需要小心你的贪婪/懒惰量化器,还要避免“出局”。大多数语言都用“”来做这件事。
编辑:@chepner提出了一个很好的观点。如果在msg字段中有一个“”,它将抛出你的正则表达式。相反,我们可以检查行/字符串的结尾,或者只是下一个标签!这是我的想法

msg=\"(.*?)(?=\" [a-z]+=|\n|$)

假设所有的标签都是小写的a-z,后面跟着=",那么这应该可以正常工作,如下所示:

相关问题