c# - 在 C# 中替换正则表达式字符串

标签 c# replace expression

我有一个 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包含一个 Regular Expression 值,并且总是期望返回 2 个组。

这四个字段(不包括 Expression )是预期找到的两个组的前缀和后缀......所以会发生这种情况:

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

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

The Predicament

我的目标是遍历每一个(RegexRules r),在一个特别长的字符串上运行其各自的表达式(r.Expression),当找到两个预期的组时,我希望脚本封装每个以显示的方式对其前缀和后缀进行分组...同样,

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

我尝试了很多不同的方法,但我知道的一件事是 str.Replace在一个循环中是行不通的。因为它会为表达式结果的每次出现一遍又一遍地应用前缀和后缀。

那么还有什么方法可以实现呢?

谢谢。

Edit

这是我目前得到的:

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);
    }
}

Edit 2 - Specifics

用户将在 .config 中创建自己的正则表达式配置文件,它将采用以下格式:

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


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

**例子**

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

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

正则表达式将捕获 foo.bar()作为一场比赛,在那foo是匹配 [1] 组 [1],和 bar根据正则表达式是match[1] group[2]。

同样适用于 bar.foo() ,因为 bar是匹配 [2] 组 [1],和 foo匹配[2]组[2]

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

最佳答案

根据我们的讨论,我认为这可能是适合您的解决方案。这与我发表的第一条评论有关。它为您的 MatchCollection 提供独特的值(value)使用 .Distinct()这样您就不会将前缀和后缀组合在一起。

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);
    }
}

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

相关文章:

c# - Hierarchy List<custom>,返回轨道

c# - 与 SOLID 和依赖注入(inject)混淆

javascript - 正则表达式 不能同时包含超过 3 个字母

javascript - 对象内部表达式 - Javascript

c# - 如何打开默认浏览器并定位某个元素?

jquery 用未知字符替换 text() 中的字符串

Javascript .replace() 对字符串不执行任何操作

Python re.sub() 不会替换所有匹配项

c# - 在已编译查询中重用现有的 linq 表达式

c# - asp.net 如何在下拉菜单中添加复选框