替换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] + FirstClose
和SecondOpen + Group[2] + SecondClose
无论如何,我有一个List<RegexRule> Rules;
,它包含一个RegexRules
对象的列表。
困境
我的目标是循环遍历每个组(RegexRules r
(,在一个特别长的字符串上运行其各自的表达式(r.Expression
(,当找到两个预期的组时,我希望脚本以所示的方式用前缀和后缀封装每个组。。。再次,
r.FirstOpen + Group[1] + r.FirstClose
和r.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]
我希望这是有道理的。。。
根据我们的讨论,我认为这可能是一个适合您的解决方案。这与我的第一句评论有关。它使用.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);
}
}