正则表达式匹配并不总是存在元素

Regex match not always present elements

我有这些输入:

+36919:60546a74:0|POST /api/v1/transactions

-36919:60546a74:0

我正在寻找一个正则表达式(或 grok 模式)来给我这些输出:

第一行:

in_out: +
id: 36919:60546a74:0
method: POST
url: /api/v1/transactions

对于第二行:

in_out: -
id: 36919:60546a74:0

非常感谢!

编辑:

我试过这个模式:

IN_OUT [+-]{1}
FORENSIC_ID .*?(?=\|?)
CUSTOM %{IN_OUT:in_out}%{FORENSIC_ID:forensic_id}\|%{WORD:method} %{URIPATHPARAM:request}

第一行给我很好的结果,但第二行没有,因为没有“|”在ID之后。

您可以使用以下正则表达式:

^(?<in_out>[-+])(?<id>[\w:]+)(?:\|(?<method>[A-Z]+)\s+(?<url>/.*))?

参见regex demo

详情:

  • ^ - 字符串开头
  • (?<in_out>[-+]) - 组“in_out”:一个 -+ 字符
  • (?<id>[\w:]+) - 组“id”:一个或多个单词或 : 个字符
  • (?:\|(?<method>[A-Z]+)\s+(?<url>/.*))? - 可选的非捕获组:
    • \| - 一个 | 字符
    • (?<method>[A-Z]+) - 组“方法”:一个或多个大写 ASCII 字母
    • \s+ - 一个或多个空格
    • (?<url>/.*) - 组“url”:a / 然后到行尾的任何零个或多个字符

以上回答正确。非常感谢!

在 grok 语法中:

IN_OUT [+-]
FORENSIC_ID [\w:]+
OPTIONAL [\|]?%{WORD:method}\s%{URIPATHPARAM:request}
CUSTOM %{IN_OUT:in_out}%{FORENSIC_ID:forensic_id}%{OPTIONAL:rest}*