用于获取方括号内数据的正则表达式模式
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>.+)
请注意,我已将捕获组 source
设为可选。
根据要求,可能需要进行一些调整。例如,我假设 source
捕获组将包含一个单词,如果 levelname
和 source
(或消息)之间存在 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'
我的正则表达式模式:
^(?<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>.+)
请注意,我已将捕获组 source
设为可选。
根据要求,可能需要进行一些调整。例如,我假设 source
捕获组将包含一个单词,如果 levelname
和 source
(或消息)之间存在 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'