如何使用分隔符匹配行的中间或末尾的字段?

时间:2015-09-21 12:45:28

标签: regex pcre separator

对不起这个标题,我不知道如何用一句话来解释我的问题。

我试图匹配日志中的字段,但我不知道它是在行中间还是在行尾。

三行示例:

B=this is a short sentence C=see you soon A=hello world
C=see you soon B=this is a short sentence A=hello world
A=hello world B=this is a short sentence C=see you soon

我想获得" C"的价值。现场(见到你)。 我的问题是最后一行,因为字符串末尾没有分隔符。

这就是我的尝试。

这个与最后一行不匹配,因为它是最后一个字段:

C=([^=]+) \w+=

这个有效,但看起来过于复杂:

C=([^=]+)(?: \w+=|$)

你会怎么做?

2 个答案:

答案 0 :(得分:0)

你的正则表达式已经很好了,我会简化开头:

C=.*?($|\n|(\w=))

您可以在此处试用:https://regex101.com/r/oN8cS2/1

答案 1 :(得分:0)

好吧,我发现开头有一个潜在的瓶颈:C=也会匹配AC=,因此我会在那里使用单词边界\b

我认为你不打算匹配下一个选项的一部分,所以我使用预测而不是非捕获组((?: \w+=))。

\bC=(.+?)(?=$|\s+[A-Z]=)

请参阅demo

此处,.+?将匹配1个或多个字符,直到字符串末尾或1个或多个空格以及大写A-Z字母后跟=

如果可以有任何Unicode字母,您可以将[A-Z]替换为\p{Lu}