gpt4 book ai didi

c# - 在 C# 中替换正则表达式匹配集合

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

我需要在文本中找到以 [ 开头并以 ] 结尾的所有内容,并将其替换为函数返回的值。所以,这是我正在做的一个例子:

    public string ProcessTemplate(string input)
{
return Regex.Replace(input, @"\[(.*?)\]", new MatchEvaluator(delegate(Match match)
{
return ProcessBlock(match.Result("$1"));
}));
}

public string ProcessBlock(string value)
{
return Block.FromString(value).Process();
}

现在,我的问题是何时需要编辑 block 。所以我想找到 block ,编辑它们,然后然后在文本中替换它们。

因此,我创建了一个 block 列表,并将 ProcessTemplate 方法分为两个方法:FindBlocksReplaceBlocks:

    public void FindBlocks(string input)
{
Input = input;

foreach (Match match in Regex.Matches(input, @"\[(.*?)\]"))
Blocks.Add(Block.FromString(match.Result("$1")));
}

public string ReplaceBlocks()
{
string input = Input;

foreach (Block block in Blocks)
input = input.Replace("[" + block.OrginalText + "]", block.Process);

return input;
}

public IList<Block> Blocks
{
get;
set;
}

public string Input
{
get;
set;
}

它可以工作,但问题是它很慢。我用 System.Diagnostics.Stopwatch 测量了每个部分,我发现 ReplaceBlocks 方法中的 String.Replace 非常慢。

我怎样才能改进它?

谢谢。

最佳答案

用 StringBuilder 替换 ReplaceBlock 中的字符串可能会提高性能,因为每次执行字符串时,替换它都必须释放并重新分配字符串。字符串生成器不需要这样做。

用以下内容替换 ReplaceBlock 的内容。

// This will require a reference to System.Text
StringBuilder input =new StringBuilder(Input);
foreach (Block block in Blocks)
{
input = input.Replace("[" + block.OrginalText + "]", block.Process);
}
return input.ToString();

我还发现用更快的 for 循环替换 foreach 循环。

关于c# - 在 C# 中替换正则表达式匹配集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1853650/

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