【发布时间】:2012-01-27 17:10:57
【问题描述】:
我在 C# 中使用 WinForms NET 2.0。
我有大约 1000-1500 行的文本文件。其中的某些行以 4 个或更多字母单词开头,我必须在这些单词中添加一个冒号。在这些行的开头有空格是可选的,并且该行可以包含除这些单词之外的更多文本。这是一个例子:
lda $00,x
mov $20
rep #$20
tax
lda #$0000,y
word
... ; comment
anotherword ; this word has whitespace before it.
另外,如果已经有一个冒号,它会简单地忽略它们以防止添加更多。这是我的代码:
Regex R = new Regex(@"^\s*(?<word>[A-Za-z0-9_]{4,})", RegexOptions.Multiline); //keep the words stored in a group called word
MatchCollection M = R.Matches(txt); //let my text file string be "txt"
foreach (Match m in M)
{
string mm = m.Groups["word"].Value;
if (!Regex.IsMatch(txt, @"^\s*\b" + mm + @"\b:", RegexOptions.Multiline)) // if already a colon, return
txt = Regex.Replace(txt, @"^\s*\b" + mm + @"\b", mm + ":", RegexOptions.Multiline);
}
一切正常,但问题是什么?它太慢了。我在文本文件中执行其他操作,但我已经确认它们很快,问题出在我上面的正则表达式中的两个“\s*”。当我同时删除它们时,搜索速度会提高 10 倍。
我该如何解决这个问题?
【问题讨论】:
-
使用多行正则表达式解析非常大的字符串会很慢。为什么不逐行读取文本文件并迭代地应用正则表达式?我至少会尝试一下并比较速度 - 实际上它可能更快。例如,从我自己的实验中,我发现拥有 2 个单独的正则表达式通常比 1 个带有交替的正则表达式更快(“或”运算符
|)。 -
@bobbymcr:嗯,我之前应该考虑过。我试一试,然后看看结果。
-
@zneak:我正在做的是 6502 组装,但这只是为了举例而抛出的一些随机代码。
标签: regex search .net-2.0 whitespace performance