我有一个 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] + FirstClose
和 SecondOpen + Group[2] + SecondClose
无论如何,我有一个List<RegexRule> Rules;
其中包含 RegexRules
的列表对象。
The Predicament
我的目标是遍历每一个(RegexRules r
),在一个特别长的字符串上运行其各自的表达式(r.Expression
),当找到两个预期的组时,我希望脚本封装每个以显示的方式对其前缀和后缀进行分组...同样,
r.FirstOpen + Group[1] + r.FirstClose
和 r.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/