gpt4 book ai didi

c# - Optimaze Regex 方法(从文本行中拆分字母数字词)

转载 作者:行者123 更新时间:2023-11-30 21:38:28 25 4
gpt4 key购买 nike

我在使用 Regex 时遇到性能问题。我使用的方法按预期工作,但处理大型文本文件需要很长时间。

我只需要从文件的每一行中提取单词:“tjdj47***ss__s*47 djj ___ s_sd4 4”

应该返回单词列表(任何超过 1 个字符的字母或字母数字序列)

tjdj47
ss
47
djj
sd4

我使用正则表达式模式

 pattern = new Regex(
@"([A-Za-z0-9]
([A-Za-z0-9])*
[A-Za-z0-9])",
RegexOptions.IgnorePatternWhitespace);

过滤和拆分单词的方法

public List<string> SplitLineIntoWords(string lineText)
{
List<string> lineWords = new List<string>();

foreach (Match m in pattern.Matches(lineText))
{
lineWords.Add(m.Groups[1].Value.ToLower());
}

return lineWords;
}

如何优化方法以更快地执行? (现在,从 350mb 的文件中分离单词最多需要 25 秒)

最佳答案

您的表达式基本上匹配包含至少 2 个字母数字字符的子字符串。

使用

var results = Regex.Matches(s, @"[A-Za-z0-9]{2,}")
.Cast<Match>()
.Select(m => m.Value)
.ToList();

参见 regex demo .

在 RegexHero.net 上查看基准测试:

enter image description here

([A-Za-z0-9]([A-Za-z0-9])*[A-Za-z0-9]) 需要更多时间来匹配因为回溯(并且还填充了第二组堆栈):

  • [A-Za-z0-9]匹配一个字母数字,然后
  • ([A-Za-z0-9])* 匹配并捕获每个字母数字,尽可能多
  • [A-Za-z0-9] 需要一个字符来匹配,因此,引擎退后一步,让字母数字字符与最后一个子模式匹配。

[A-Za-z0-9]{2,} 没有回溯,因为只有一种方法可以匹配字符串。

下面是两个模式如何只获得第一个匹配项的比较(使用 PCRE 选项完成,但它非常接近 .NET 所做的):1) your regex和 2) my solution .

正则表达式 1:

enter image description here

正则表达式 2:

enter image description here

关于c# - Optimaze Regex 方法(从文本行中拆分字母数字词),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45969670/

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