正则表达式,提取 select 文本
Regex, extract select text
我对微软的regex(正则表达式)有疑问。我有一个以这种模式写入的日志文件。
2017-02-20 15:58:45.442 - [XYZ] 155 RADIO_TRAIN_TO_TRACK_INITIATION_COM_SESSION
.VAR1p
.VAR2o
.VAR3i
.VAR4u
2017-02-20 15:58:46.432 - [XYZ] 32 RADIO_TRACK_TO_TRAIN_CONFIGURATION_DETERMINATION
.VAR1
.VAR2
.VAR3
.VAR4
.VAR5
.VAR6
2017-02-20 15:58:48.541 - [XYZ] 158 RADIO_TRAIN_TO_TRACK_INITIATION_COM_SESSION
.VAR1x
.VAR2c
.VAR3v
.VAR4f
.VAR5d
.VAR6s
我的问题是:如何从 2017-02-20 15:58:45.442 - [XYZ] 155... 中提取所有文本到 .VAR4u(包括消息 155 的所有文本),以及消息 158 的所有文本(包括时间戳)
我写了这段代码,但它 运行 不正确
(?<=\[XYZ] \b155\b(?:(?!\n\d{4}-\d{2}-\d).)*?\n {3,}\.)|(?<=\[XYZ] +\b158\b(?:(?!\n\d{4}-\d{2}-\d).)*?\n {3,}\.)
此致
DnGrep 工具使用了一个奇怪的 .NET 正则表达式实现:一旦使用了先行限制,最后一行就不会匹配。一定是bug。
无论如何,有效的是
(?m)^\d{4}-\d{2}-\d{2} \d{2}:[\d.:]+ - \[(?:RBC] +\b24|TRENO] \b156)\b(?:(?!\n\d{4}-\d{2}-\d).)*\.\w+[^\r\n]*
选中多行和点作为换行符复选框。
\.\w+[^\r\n]*
部分必须匹配最后一行的非空白部分(\.
匹配一个点,\w+
- 1+ 个字符,[^\r\n]*
会匹配除CR和LF以外的一个或多个符号,可以用(?-s:.*) - a modifier group where the "Dot as newline" should be disabled
)代替。
这部分 - \[(?:RBC] +\b24|TRENO] \b156)
- 用于避免重复整个模式(就像你在评论中所做的那样)。这将匹配 [
,然后是 RBC]
+spaces+24,或 TRENO 156
(都是整个单词,因为模式后面有 \b
)。
我对微软的regex(正则表达式)有疑问。我有一个以这种模式写入的日志文件。
2017-02-20 15:58:45.442 - [XYZ] 155 RADIO_TRAIN_TO_TRACK_INITIATION_COM_SESSION
.VAR1p
.VAR2o
.VAR3i
.VAR4u
2017-02-20 15:58:46.432 - [XYZ] 32 RADIO_TRACK_TO_TRAIN_CONFIGURATION_DETERMINATION
.VAR1
.VAR2
.VAR3
.VAR4
.VAR5
.VAR6
2017-02-20 15:58:48.541 - [XYZ] 158 RADIO_TRAIN_TO_TRACK_INITIATION_COM_SESSION
.VAR1x
.VAR2c
.VAR3v
.VAR4f
.VAR5d
.VAR6s
我的问题是:如何从 2017-02-20 15:58:45.442 - [XYZ] 155... 中提取所有文本到 .VAR4u(包括消息 155 的所有文本),以及消息 158 的所有文本(包括时间戳)
我写了这段代码,但它 运行 不正确
(?<=\[XYZ] \b155\b(?:(?!\n\d{4}-\d{2}-\d).)*?\n {3,}\.)|(?<=\[XYZ] +\b158\b(?:(?!\n\d{4}-\d{2}-\d).)*?\n {3,}\.)
此致
DnGrep 工具使用了一个奇怪的 .NET 正则表达式实现:一旦使用了先行限制,最后一行就不会匹配。一定是bug。
无论如何,有效的是
(?m)^\d{4}-\d{2}-\d{2} \d{2}:[\d.:]+ - \[(?:RBC] +\b24|TRENO] \b156)\b(?:(?!\n\d{4}-\d{2}-\d).)*\.\w+[^\r\n]*
选中多行和点作为换行符复选框。
\.\w+[^\r\n]*
部分必须匹配最后一行的非空白部分(\.
匹配一个点,\w+
- 1+ 个字符,[^\r\n]*
会匹配除CR和LF以外的一个或多个符号,可以用(?-s:.*) - a modifier group where the "Dot as newline" should be disabled
)代替。
这部分 - \[(?:RBC] +\b24|TRENO] \b156)
- 用于避免重复整个模式(就像你在评论中所做的那样)。这将匹配 [
,然后是 RBC]
+spaces+24,或 TRENO 156
(都是整个单词,因为模式后面有 \b
)。