gpt4 book ai didi

c# - 解析大文件时避免正则表达式回溯

转载 作者:行者123 更新时间:2023-11-30 23:03:46 25 4
gpt4 key购买 nike

我正在解析一些符合某种模式的文件,以生成人类可读的报告。我使用正则表达式来解析这些文件。

文件示例:

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)所以我想稍微优化一下。当前的问题是所有 backtracking 我在 body 之前和 (?:.|>\n|>\r\n)* 在 MessageProperties 之前(我需要明确地包含换行符)对于我给出的第三个示例记录)。

有没有办法优化所有这些回溯?我找不到办法。

我正在使用 regex101 开发它,然后将其调整为 .Net

最佳答案

一般提示和改进

尽量避免单个字符交替,量化右侧部分而不是左侧部分,并尽可能使用字符类。使用 unroll the loop principle 可以更好地展开两个字符串之间的未知文本(也就是说,不要使用 .*.*? 即使您很想这样做)。

您的解决方案

你可以使用

^([0-9]{4}-[- :.0-9]*):\s+[^-]*\s+-\s+Body:\s+([^.]*(?:\.(?!\s+MessageProperties\s)[^.]*)*\.\s+MessageProperties\s+)(\[.*])

参见 regex demo

详情

  • ^ - 一行的开头(与 RegexOptions.Multiline 选项一起使用,或者当 (?m) 被添加到模式之前时)
  • ([0-9]{4}-[- :.0-9]*) - 第 1 组:
    • [0-9]{4} - 4 位数字
    • - - 连字符
    • [- :.0-9]* - 0+ 位,., :, -或空格字符-:\s+[^-]*\s+-\s+ - :, 1+ 空格, 0+ - 以外的字符, 1 + 空格,-,1+ 个空格
  • 主体: - 一个子串
  • \s+ - 1+ 个空格
  • ([^.]*(?:\.(?!\s+MessageProperties\s)[^.]*)*\.\s+MessageProperties\s+) - 第 2 组:
    • [^.]*(?:\.(?!\s+MessageProperties\s)[^.]*)* - 展开的 (?s:.*? ):除 . 之外的任何 0+ 个字符,后跟 . 的 0+ 个序列,不后跟 MessageProperties,并用 1+ 括起来空格,然后是 以外的任何 0+ 个字符。
    • \.\s+ - 一个 . 和 1+ 个空格
    • MessageProperties - 一个子字符串
    • \s+ - 1+ 个空格
  • (\[.*]) - 第 3 组:[ 后跟除换行符之外的任何 0+ 个字符,尽可能多,然后是 ].

关于c# - 解析大文件时避免正则表达式回溯,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49759115/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com