替换C#中的Regex字符串

本文关键字:字符串 Regex 中的 替换 | 更新日期: 2023-09-27 18:01:25

我有一个Regexrule.cs类,它由以下属性组成:

    public string Expression { get; set; }
    public string FirstOpen { get; set; }
    public string FirstClose { get; set; }
    public string SecondOpen { get; set; }
    public string SecondClose { get; set; }

Expression持有一个正则表达式值,并且它总是期望返回2个组。

四个字段(不包括Expression(是预期找到的两个组的前缀和后缀。。。这样就发生了:

FirstOpen + Group[1] + FirstCloseSecondOpen + Group[2] + SecondClose

无论如何,我有一个List<RegexRule> Rules;,它包含一个RegexRules对象的列表。

困境

我的目标是循环遍历每个组(RegexRules r(,在一个特别长的字符串上运行其各自的表达式(r.Expression(,当找到两个预期的组时,我希望脚本以所示的方式用前缀和后缀封装每个组。。。再次,

r.FirstOpen + Group[1] + r.FirstCloser.SecondOpen + Group[2] + r.SecondClose

我尝试了很多不同的方法,但有一点我知道str.Replace不会循环工作。因为它将一次又一次地应用前缀和后缀,用于表达式结果的每次出现。

那么,这还能怎样实现呢?

谢谢。

编辑

这就是我目前拥有的:

foreach (RegexRule r in RegexRules.ToList())
{ 
    Regex rx = new Regex(r.Expression); 
    MatchCollection mc = rx.Matches(str); 
    foreach (Match m in mc) 
    { 
         MessageBox.Show("replacing");
         str = str.Replace(m.Groups[1].Value, r.OpenBBOne + m.Groups[1].Value + r.CloseBBOne);
    }
}

编辑2-特定

用户将在.config文件中创建自己的Regex配置,其格式如下:

reg {('w+).('w+)'(');} = [("prefix1","suffix1"),("prefix2","suffix2")];


reg-用于定义新RegexRule的标准字
{ {('w+).('w+)'('); }-它们的正则表达式(CONDITION:表达式在其匹配项中必须始终返回2个组(
[("prefix1","suffix1"),("prefix2","suffix2")]-`[(","(,(","(]中的两个参数-表示两组的前缀和后缀

**示例**

如果我们将上述配置应用于此字符串:

Lorem ipsum foo.bar(); dolor sit bar.foo(); amit consecteteur...

正则表达式将捕获foo.bar()作为匹配,因为根据正则表达式,foo是match[1]组[1],bar是match[1][2]组。

bar.foo()也是如此,因为bar匹配[2]组[1],foo匹配[2]组[2]

我希望这是有道理的。。。

替换C#中的Regex字符串

根据我们的讨论,我认为这可能是一个适合您的解决方案。这与我的第一句评论有关。它使用.Distinct()为您的MatchCollection提供了唯一的值,这样您就不会合成前缀和后缀。

foreach(RegexRule r in RegexRules.ToList())
{ 
    Regex rx = new Regex(r.Expression); 
    MatchCollection mc = rx.Matches(str); 
    foreach(Match m in mc.OfType<Match>().Distinct()) 
    { 
         MessageBox.Show("replacing");
         str = str.Replace(m.Groups[1].Value, 
                           r.OpenBBOne + m.Groups[1].Value + r.CloseBBOne);
    }
}

如果您由于某种原因无法使用LINQ,那么您可以通过创建一个新的List<Match>并只添加列表中尚未添加的内容,基本上自己也可以做同样的事情。

foreach(RegexRule r in RegexRules.ToList())
{ 
    Regex rx = new Regex(r.Expression); 
    MatchCollection mc = rx.Matches(str);
    List<Match> matches = new List<Match>();
    List<string> strings = new List<string>();
    foreach(Match m in mc)
        if(!strings.Contains(m.Value))
        {
            matches.Add(m);
            strings.Add(m.Value);
        }
    foreach(Match m in matches) 
    { 
         MessageBox.Show("replacing");
         str = str.Replace(m.Groups[1].Value, 
                           r.OpenBBOne + m.Groups[1].Value + r.CloseBBOne);
    }
}