我正在使用C#regex解析文本.我想为每场比赛只替换一个特定组.我在这里是怎么做的:
void Replace(){
string newText = Regex.Replace(File.ReadAllText(sourceFile), myRegex, Matcher, RegexOptions.Singleline);
//.......
}
void string Matcher(Match m){
// how do I replace m.Groups[2] with "replacedText"?
return ""; // I want to return m.Value with replaced m.Group[2]
}
Run Code Online (Sandbox Code Playgroud)
Jus*_*gan 11
这应该这样做:
string Matcher(Match m)
{
if (m.Groups.Count < 3)
{
return m.Value;
}
return string.Join("", m.Groups
.OfType<Group>() //for LINQ
.Select((g, i) => i == 2 ? "replacedText" : g.Value)
.Skip(1) //for Groups[0]
.ToArray());
}
Run Code Online (Sandbox Code Playgroud)
示例:http://rextester.com/DLGVPA38953
编辑:虽然以上是你的问题的答案,你可能会发现零宽度的外观更简单:
Regex.Replace(input, @"(?<=e)l+(?=o)", replacement)
Run Code Online (Sandbox Code Playgroud)
示例:http://rextester.com/SOWWS24307
您可以使用MatchEvaluator:试试这个。
var replaced = Regex.Replace(text, pattern, m => m.Groups[1] + "AA" + m.Groups[3]);
Run Code Online (Sandbox Code Playgroud)
我在 stackoverflow 中找到了一篇与此相关的帖子:watch This
这个怎么样?
static string Matcher(Match m)
{
var group = m.Groups[2];
var startIndex = group.Index - m.Index;
var length = group.Length;
var original = m.Value;
var prior = original.Substring(0, startIndex);
var trailing = original.Substring(startIndex + length);
return string.Concat(prior, "replacedText", trailing);
}
Run Code Online (Sandbox Code Playgroud)