使用char预先填充字符串的所有实例

时间:2011-12-22 07:20:03

标签: c# regex string .net-2.0

我正在使用C#。 NET 2.0和WinForms。

我有一段代码在Assembly中格式化,如下所示:

VARIABLE = 40
ADDRESS = $60

LDA VARIABLE;
STA ADDRESS;

输出应为:

!VARIABLE = 40
!ADDRESS = $60

LDA !VARIABLE;
STA !ADDRESS;

当然,还有更多。像2000行一样,但关键是文件顶部有声明,我可以加载/保存或用它们做任何事情。但我的问题是,我必须用!来“预装”所有这些声明(即使在原始代码中)。

我目前的方法是:

        var defs = tab.tb.GetRanges(@"^\s*([A-Za-z0-9_]+){4,255}\s*=", RegexOptions.Multiline); // all declarations are formatted like this, so use regex to get all of them
        foreach (var def in defs)
        {
            string actual = def.Text.Substring(0, def.Text.IndexOf(' ')); // remove the = sign since its not used in actual code
                txt = txt.Replace(actual, "!" + actual);
        }

但是,这种方法非常慢。 “修复”我文件中的所有声明大约需要3秒钟。有没有更好的方法?对于记录,语法与普通文本框略有不同,因为我使用http://www.codeproject.com/KB/edit/FastColoredTextBox_.aspx作为我的文本控件。

3 个答案:

答案 0 :(得分:2)

我怀疑您的性能问题在于str上的替换。 .NET中的字符串是不可变的,因此当您执行任何更改字符串的操作(追加,替换等)时,.NET必须创建一个新字符串并将旧字符串复制到其中(所有2000行),以及变化。尝试将字符串加载到StringBuilder(这是可变的),并使用它的原生.Replace()方法。

答案 1 :(得分:2)

这是一个快速尝试。在我的机器上,它处理一个25000+行文件< 100毫秒。

但是,我只有两个样本值以此为基础;随着更多的替换操作,性能将下降。

更新:我尝试了另一个样本,这次有25000行和8个唯一值来修改。性能仅降低了几毫秒。

Stopwatch sw = new Stopwatch();
string text = File.ReadAllText( @"C:\\temp\so.txt" );

sw.Start();

// find the tokens we will be replacing
Regex tokenFinder = new Regex( @"^(([A-Za-z0-9_]+){4,255})\s*(=)", RegexOptions.Multiline );

// ensure uniqueness, and remove "=" by looking at the second match group
var tokens = ( from Match m in tokenFinder.Matches( text ) select m.Groups[1].Value ).Distinct();

// perform replace for each token...performance here will greatly vary based on the number of tokens to replace
foreach( string token in tokens )
{
    Regex replaceRegex = new Regex( token );
    text = replaceRegex.Replace( text, string.Concat( "!", token.Trim() ) );
}

sw.Stop();
Console.WriteLine( "Complete in {0}ms.", sw.ElapsedMilliseconds );

答案 2 :(得分:1)

你在你的正则表达式中嵌套量词!

([A-Za-z0-9_]+){4,255}

将一个简单的字符串作为'aaaaaaaa':什么是正则表达式引擎应该捕获? 'a'8次,'aa'4次,'aa',然后'a',然后'a',然后......?

这很可能是导致性能问题的原因。就是不要那样做!您尝试在整个文件中匹配的所有内容。即使正则表达式引擎最终会选择最左边,最长的匹配,它总是尝试所有的可能性。

删除+