【发布时间】:2019-04-01 08:49:16
【问题描述】:
我需要从下面的示例文本中获取日期字符串,即 2019-01-22 15:36:141,023,仅当行包含 Correct 而不是 >Test12 字。所以我最好在下面的字符串中得到两个匹配项(第 3 行和第 5 行)。
第 1 行:2019-01-22 15:36:141,043:[测试][123] 信息 - 测试:正确的 Test12 ping
第 2 行:2019-01-22 15:36:141,029:[测试][124323] 信息 - 测试:错误的 Test12 ping
第 3 行:2019-01-22 15:36:141,023:[测试][12554363] 信息 - 测试:正确的测试 ping
第 4 行:2019-01-22 15:36:141,123:[测试][6761213] 信息 - 测试:错误的 Test12 ping
第 5 行:2019-01-22 15:36:141,093:[测试][46543123] 信息 - 测试:测试 ping 无效
第 6 行:2019-01-22 15:36:141,890:[测试][887] 信息 - 测试:正确的测试 ping
我可以使用 (?\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2 获取日期字符串}(?:,\d{3}\b)?) 但不确定如何包含其他条件。有什么线索吗?
【问题讨论】:
-
为什么不单独执行附加检查?这将使代码保持“干净”并且提取正则表达式更易于维护。
-
同意维克托。但是,您可以将“正确”和“测试”附加到您当前的正则表达式。 Demo
-
您可以使用像
\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2,}(?:,\d{3}\b)?(?=.*\r?$(?<!Test12.*)(?<=Correct.*))这样的正则表达式,但如果您可以访问代码,这并不是正确的方法。 -
@coder89 你没有使用多行选项,添加它,
(?m)在模式的开头,或者用RegexOptions.Multiline编译 -
如果您不需要在日期之前检查这些单词,请尝试
\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2,}(?:,\d{3}\b)?(?!.*Test12)(?=.*Correct)