我需要标记一个字符串,其中包含指示已通过测试的子字符串的开头和结尾的标识符。
假设我有一个字符串“快速的棕色狐狸跳过懒狗”,我想用字符'b'和'o'开头的每个单词标记字符串。最后的字符串看起来像“快速<tag>brown</tag>
狐狸跳跃<tag>over</tag>
懒狗”。
使用正则表达式和LINQ的组合我有正确的逻辑来完成我想要的但我的性能不是我想要的,因为我使用String.Insert插入标记。我们的字符串可以很长(> 200k)并且标记的子字符串的数量可以接近一百。下面是我用来插入标签的代码。鉴于我知道每个子字符串的开始和长度,如何更快地更新字符串'input'?
.ForEach<Match>(m => {
input = input.Insert(m.Index + m.Length, "</tag>");
input = input.Insert(m.Index, "<tag>");
});
答案 0 :(得分:10)
您应该使用StringBuilder
。
为获得最佳性能,请在执行任何操作之前设置StringBuilder
的容量,然后在标记之间附加原始字符串的块。
或者,将您的逻辑移至MatchEvaluator
lambda表达式并调用RegeEx.Replace
。
答案 1 :(得分:2)
试试这个:
Regex.Replace("The quick brown fox jumps over the lazy dog", @"(^|\s)([bo]\w*)", "$1<tag>$2</tag>");
The quick <tag>brown</tag> fox jumps <tag>over</tag> the lazy dog
正则表达式应该提供相当快速的替换。这种方法是否最好取决于字符串的长度以及实际匹配一个“单词”所涉及的工作量。
答案 2 :(得分:1)
字符串操作非常慢。请改用System.Text.StringBuilder。
它还有一个Insert方法。
此外,MSDN有一篇关于改进Improving String Handling Performance 的文章,它将StringBuilder与普通的String操作进行比较。如果您之前从未遇到过这个话题,那么值得一读。
答案 3 :(得分:1)