gpt4 book ai didi

c# - 正则表达式:lookbehind 的性能,同时仍然捕获数据?

转载 作者:太空宇宙 更新时间:2023-11-03 13:50:13 25 4
gpt4 key购买 nike

在我的 C# 项目中,我正在为日期解析文本。日期可以有多种格式,目的是找出并纠正一些日期格式错误。各种日期格式意味着一组定义的日期格式是不可行的。最初我有一组大约 10 个正则表达式,一个一个地应用于输入字符串。这在功能上很好,但是当字符串接近 200 KB 文本时,性能就成了问题,因为该函数花费了大约 150 毫秒。

我发现我可以通过将日期正则表达式仅应用于日期子字符串来显着提高性能。因此,如果所有日期都必须具有英文月份名称,则使用

的正则表达式
\b(January|February|March|April|May|June|July|August|September|October|November|December)\b

会找到他们。如果我随后进行了一些子字符串处理以使月份周围的文本匹配,则整体函数性能约为 25 毫秒,好多了。但是,子字符串/循环、长度检查代码不整洁,感觉不是一个很好的解决方案。我真正想要的是一个正则表达式来匹配月份和它周围的文本,比如

.{0,25}\b(January|February|March|April|May|June|July|August|September|October|November|December)\b.{0,25}

功能正常。但是,此正则表达式的性能大约需要 3500 毫秒才能在相同的长输入字符串上找到匹配项。

现在类似的正则表达式

(?<=.{0,25})\b(January|February|March|April|May|June|July|August|September|October|November|December)\b.{0,25}

积极的后视在大约 15 毫秒内找到匹配项(由于回溯大大减少,我接受并有一定理解的原因)。但是,这对我来说不起作用,因为我需要将月份名称前后的文本包含在匹配结果中。

所以,我的问题是,我能否拥有一个既具有使用后视的性能,又具有在匹配结果中提供所有文本的功能的正则表达式?

最佳答案

性能提升是一种幻觉。通常,.{0,25} 之类的内容会导致大量回溯,这就解释了您所看到的糟糕性能。但是,当放置在回溯中时,它将停止贪婪和回溯行为,回溯将寻找可能的最小匹配,这意味着将尝试 0 个字符,没有回溯。这意味着后视是完全无用的,因为它总是匹配月份名称前的零个字符。

如果在使用匹配位置找到月份名称的匹配项后提取上下文怎么办?对于每个 matchregex.Matches(str) 中,得到 match.Indexmatch.Length以及这些位置前后的子字符串。

关于c# - 正则表达式:lookbehind 的性能,同时仍然捕获数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13894684/

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