这是输入字符串23x * y34x2
。我想在每个数字后跟字母,然后在每个字母后跟数字后插入" * "
(星号,用空格包围)。所以我的输出字符串如下所示:23 * x * y * 34 * x * 2
。
这是完成工作的正则表达式:@"\d(?=[a-z])|[a-z](?=\d)"
。这是我编写的插入" * "
的函数。
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??
}
最佳答案
MatchEvaluator是接受Match对象并返回应替换而不是匹配的字符串的委托(delegate)。您也可以引用比赛中的组。您可以按以下方式重写代码:
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 + " * ";
});
举一个如何工作的例子,第一次调用委托(delegate)时,Match参数将是字符串
"3"
上的匹配项。在这种情况下,委托(delegate)被定义为将匹配本身作为与" * "
连接的字符串返回。因此,第一个"3"
替换为"3 * "
。该过程以这种方式继续进行,对于原始字符串中的每个匹配,都会调用一次委托(delegate)。
关于c# - Regex.Replace中的MatchEvaluator如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2587866/