【问题标题】:How to match a field in the middle or the end of a line with separators?如何将行中或行尾的字段与分隔符匹配?
【发布时间】:2015-12-18 04:12:58
【问题描述】:

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

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

三行示例:

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+=|$)

你会怎么做?

【问题讨论】:

  • 如果它对你有用,你希望得到什么答案?
  • 是的。你的答案是正确的。有时指令必须很复杂才能涵盖所有角落和边缘情况。此外,请使用+? 而不是+。否则在第二种情况下将不起作用。
  • 另外,什么语言?爪哇?
  • 有时事情会奏效,但你觉得有更好的事情要做,或者你还不知道的简短方法......
  • @MadPhysicist 我不明白我为什么要使用 +?你能解释一下吗? :)

标签: regex pcre separator


【解决方案1】:

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

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

您可以在这里试用:https://regex101.com/r/oN8cS2/1

【讨论】:

    【解决方案2】:

    嗯,我看到开头有一个潜在的瓶颈:C= 也将匹配 AC=,因此我将在那里使用单词边界 \b

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

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

    demo

    这里,.+? 将匹配 1 个或多个字符,直到字符串的末尾或 1 个或多个空格和一个大写的 A-Z 字母后跟 =

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多