【发布时间】:2026-01-19 03:45:01
【问题描述】:
我正在解析一些符合模式的文件以生成人类可读的报告。我使用正则表达式来解析这些文件。
文件示例:
2012-05-10 08:00:00.155: BROADCAST - Body: <?xml version="1.0" encoding="UTF-8" standalone="yes"?><Data></Data>. MessageProperties [headers={X_Day=20120510}]
2012-05-10 08:00:00.155: BROADCAST - Body: <?xml version="1.0" encoding="UTF-8" standalone="yes"?><Data></Data>. MessageProperties [headers={X_Day=20120510}]
2012-05-10 08:00:00.155: REQUEST - Body: <?xml version="1.0" encoding="utf-8"?>
<Data xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<field1>field1.val</field1>
<field2>field2.val</field2>
</Data>. MessageProperties [headers={X_Day=20120510}, correlationId=[51, 56, 100, 54, 48, 48, 97, 54, 51, 99, 102, 100, 52, 102, 97, 51, 98, 51, 57, 52, 52, 49, 49, 50, 54, 97, 56, 100, 49, 48, 53, 98], other=blabla]
我要提取每条记录的时间部分、xml部分和属性部分。
正则表达式
目前我有这个正则表达式,它给了我我想要的东西(如果这有助于提高正则表达式的速度,我可以在以后的处理中提取所需的确切位) :
((?:[0-9]{1,4}[-| |:|\.])+[0-9]{1,3}): .*Body: ((?:.|>\n|>\r|>\r\n)*\. MessageProperties )(\[.*\])
文件可能很大(比如 2000-10000 个匹配项和 100Mb),所以我想对其进行一些优化。当前的问题是我在正文之前的 .* 和 MessageProperties 之前的 (?:.|>\n|>\r\n)* 的所有回溯(我需要明确包含换行符对于我给出的第三个示例记录)。
有没有办法优化所有这些回溯?我找不到办法。
我正在使用 regex101 进行开发,然后将其调整为 .Net。
【问题讨论】:
-
老实说,如果您正在寻找性能,您可能想编写自己的解析代码而忘记正则表达式。
-
我不想那么难优化它,我认为这个正则表达式可以很容易地优化。目前我有一秒钟的时间来解析一个文件,但半秒钟左右我很好。
-
具体来说,您是否将该正则表达式应用于整个文件?如果是这样,我至少建议一次从文件中读取一行并将该行添加到缓冲区中。当您看到以日期开头的行时,处理缓冲区中的行,清除缓冲区并添加新行。
-
学习使用字符类。
(:|-|=)+应该写成[:=-]+。 -
感谢@juharr 的建议,如果没有人发布另一个答案,也许我会那样做。
标签: c# regex .net-core backtracking