c#-Regex.Replace中的MatchEvaluator如何工作?

这是输入字符串23x * y34x2。我想在每个数字后跟字母,然后在每个字母后跟数字后插入MatchEvaluator(用空格包围的星号)。 因此,我的输入字符串将如下所示:MatchEvaluator

这是完成工作的正则表达式:MatchEvaluator。这是我编写的插入MatchEvaluator的函数。

Regex reg = new Regex(@"\d(?=[a-z])|[a-z](?=\d)");   
MatchCollection matchC;
matchC = reg.Matches(input);
int ii = 1;
foreach (Match element in matchC)//foreach match I will find the index of that match
{
    input = input.Insert(element.Index + ii, " * ");//since I' am inserting " * " ( 3 characters )
    ii += 3;                                        //I must increment index by 3
}
return input; //return modified input

我的问题是如何使用.net MatchEvaluator做同样的工作? 我是regex的新手,也不了解用MatchEvaluator进行良好的替换。这是我尝试编写的代码:

    Regex reg = new Regex(@"\d(?=[a-z])|[a-z](?=\d)");
    MatchEvaluator matchEval = new MatchEvaluator(ReplaceStar);
    input = reg.Replace(input, matchEval);
    return input;
}
public string ReplaceStar( Match match )
{
    //return What??
}
dontoo asked 2020-08-06T09:44:34Z
1个解决方案
63 votes

MatchEvaluator是一个接受Match对象并返回一个应替换而不是匹配的字符串的委托。 您还可以参考比赛中的组。 您可以按以下方式重写代码:

string input = "23x * y34x2";
Regex reg = new Regex(@"\d(?=[a-z])|[a-z](?=\d)");
string result = reg.Replace(input, delegate(Match m) {
    return m.Value + " * ";
});

例如,第一次调用该委托时,Match参数将是字符串"3"上的一个匹配项。在这种情况下,该委托被定义为将匹配项本身返回为与" * "相连的字符串。 "3""3 * "取代。

该过程以这种方式继续进行,对于原始字符串中的每个匹配,都将调用一次委托。

Mark Byers answered 2020-08-06T09:44:49Z
translate from https://stackoverflow.com:/questions/2587866/how-does-matchevaluator-in-regex-replace-work