用于获取方括号内数据的正则表达式模式

Regex pattern to fetch data inside square brackets

我的正则表达式模式:

^(?<timestamp>[a-zA-Z]{3} [0-9]{1,2} [0-9]{1,2}\:[0-9]{1,2}\:[0-9]{1,2}\.[0-9]{1,6}) (?<levelname>[A-Z]) ?(ERR:)? ?(?<source>\[.*\])? (?<message>.*)

Test_String_1 = "10 月 25 日 14:24:29.700799 我 [系统] 已连接"

根据我的正则表达式模式输出:

Match groups:
timestamp   Oct 25 14:24:29.700799
levelname   I
source      [System]
message     Connected

Test_String_2 = “10 月 25 日 14:24:30.315344 E 错误:[[信号]] 有效共享内存!”

根据我的正则表达式模式输出:

Match groups:
timestamp   Oct 25 14:24:30.315344
levelname   E
source      [[Signal]]
message     Valid Shared Mem!

但是我期待 Test_String_1 和 Test_String_2 的以下结果:

Test_String_1:

Match groups:
timestamp   Oct 25 14:24:29.700799
levelname   I
source      System    
message     Connected

Test_String_2:

Match groups:
timestamp   Oct 25 14:24:30.315344
levelname   E
source      Signal
message     Valid Shared Mem!

我应该对我的正则表达式模式进行哪些更改才能获得预期的结果。我正在使用 https://rubular.com/ 进行正则表达式测试。

[编辑]: Test_String_3 = "10 月 25 日 14:24:29.653900 D 连接被拒绝"

预期输出:

Match groups:
timestamp   Oct 25 14:24:29.653900
levelname   D
source  
message     Connection refused

我想这就是你想要的

^(?<timestamp>[a-zA-Z]{3} [0-9]{1,2} [0-9]{1,2}\:[0-9]{1,2}\:[0-9]{1,2}\.[0-9]{1,6}) (?<levelname>[A-Z]) ?(ERR:)? ?(\[*(?<source>\w*)\]*) (?<message>.*)

方括号应包裹 source 字段。

您可以匹配以下正则表达式。

^(?P<timestamp>[JFMASOND][a-z]{2} [0123]\d [012]\d(?::[0-5]\d){2}\.\d{6}\b) (?P<levelname>[A-Z]) +(?:[A-Z]+: +)?(?:\[+(?P<source>[A-Za-z]+)\]+)? *(?P<message>.+)

Demo

请注意,我已将捕获组 source 设为可选。

根据要求,可能需要进行一些调整。例如,我假设 source 捕获组将包含一个单词,如果 levelnamesource(或消息)之间存在 non-spaces,它将包含一个或多个大写字母后跟一个冒号,如第二个示例 ('ERR:')。我还假设必须指定 timestamp 格式的严格程度以及应将哪些捕获组设为可选。这些当然只是对规范的猜测,因为它们没有在问题中详细说明。

正则表达式可以分解如下。请注意,我在字符 类 ([ ]) 中放置了单独的空格,只是为了让它们对 reader 可见。我用 Python 测试了这个(命名字符 类 被写成 (?P<name>....),但它也可以在 Ruby 中工作。

^                     # match beginning of string
(?P<timestamp>        # begin 'timestamp' capture group
  [JFMASOND]          # match a cap letter in the char class
  [a-z]{2}            # match two lowercase letters
  [ ]                 # match a space
  [0123]\d            # match a digit in the char class then any digit
  [ ]                 # match a space
  [012]\d             # match a digit in the char class then any digit
  (?:                 # begin a non-capture group
    :                 # match a colon
    [0-5]\d           # match a digit in the char class then any digit 
  ){2}                # end non-capture group and execute it twice
  \.                  # match a period
  \d{6}               # match 6 digits
  \b                  # match a word boundary
)                     # end timestamp capture group
(?P<levelname>        # begin 'levelname' capture group
  [A-Z])[ ]+          # match a capital letter then >= 1 spaces
)                     # end 'levelname' capture group 
(?:[A-Z]+:[ ]+)?      # optionally match >= 1 capital letters
                      # then >= 1 spaces
(?:                   # begin non-capture group
  \[+                 # match one or more left brackets
  (?P<source>         # begin capture group 'source'
    [A-Za-z]+         # match >= 1 chars in char class
  )                   # end capture group 'source'
  \]+                 # match one or more right brackets
)?                    # end non-capture group and make optional
[ ]*                  # match >= 0 spaces
(?P<message>.+)       # match rest of line and save to capture
                      # group 'message'