用不同的替换替换多个正则表达式匹配

Posted

技术标签:

【中文标题】用不同的替换替换多个正则表达式匹配【英文标题】:Replace multiple Regex Matches each with a different replacement 【发布时间】:2016-05-11 09:07:56 【问题描述】:

我有一个字符串,它可能与指定模式有多个匹配项。

每个都需要更换。

我有这个代码:

var pattern = @"\$\$\@[a-zA-Z0-9_]*\b";
var stringVariableMatches = Regex.Matches(strValue, pattern);
var sb = new StringBuilder(strValue);

foreach (Match stringVarMatch in stringVariableMatches)

    var stringReplacment = variablesDictionary[stringVarMatch.Value];
    sb.Remove(stringVarMatch.Index, stringVarMatch.Length)
            .Insert(stringVarMatch.Index, stringReplacment);


return sb.ToString();

问题是,当我有多个匹配项时,第一个被替换,另一个的起始索引被更改,因此在某些情况下,当字符串被缩短时,替换后的索引超出范围..

我知道我可以在每场比赛中只使用Regex.Replace,但这种声音表现很重,我想看看是否有人可以指出不同的解决方案来用不同的字符串替换多个匹配项。

【问题讨论】:

Regex.Replace 为每个匹配,但是这个 sound 性能很重您的数据大小是多少? 我有大约 100,000 个这样的字符串来反复思考......每个可能有 1-3 个匹配项来替换每个不同的字符串。 @LucasTrzesniewski:我认为 Mortalus 意味着在 foreach 中使用 Regex.Replace 是性能杀手。关键是Regex.Replace 可以代替 使用Regex.Matches @WiktorStribiżew 是的,我想我误解了他的意图(他对你的回答的评论证实了这一点) 【参考方案1】:

Regex.Replace 中使用匹配评估器:

var pattern = @"\$\$\@[a-zA-Z0-9_]*\b";
var stringVariableMatches = Regex.Replace(strValue, pattern, 
        m => variablesDictionary[m.Value]);

Regex.Replace 方法将执行 全局 替换,即将搜索与指定模式匹配的所有非重叠子字符串,并将每个找到的匹配值替换为 variablesDictionary[m.Value]

请注意,check if the key exists in the dictionary 可能是个好主意。

见C# demo:

using System;
using System.IO;
using System.Text.RegularExpressions;
using System.Collections.Generic;
using System.Linq;
public class Test

    public static void Main()
    
        var variablesDictionary = new Dictionary<string, string>();
        variablesDictionary.Add("$$@Key", "Value");
        var pattern = @"\$\$@[a-zA-Z0-9_]+\b";
        var stringVariableMatches = Regex.Replace("$$@Unknown and $$@Key", pattern, 
                m => variablesDictionary.ContainsKey(m.Value) ? variablesDictionary[m.Value] : m.Value);
        Console.WriteLine(stringVariableMatches);
    

输出:$$@Unknown and Value

【讨论】:

别担心,我仔细研究个人资料,看看有趣的内容,然后投票给值得投票的内容。很少,我会说:从来没有,系统启动并确定我的活动是“连续投票”;-)

以上是关于用不同的替换替换多个正则表达式匹配的主要内容,如果未能解决你的问题,请参考以下文章

Android怎么用正则表达式替换字符串某些字符?

正则表达式如何替换并修改自身的部分内容?

正则表达式替换:匹配中的多个替换

Java 正则表达式 替换字符串中人名

正则表达式高级替换,匹配后进行运算,然后使用结果替换,怎么实现?

正则表达式匹配替换第n次出现