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

标签 c# .net regex replace matchevaluator

这是输入字符串 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 完成同样的工作?我是正则表达式的新手,不了解用 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??
}

最佳答案

A MatchEvaluator是一个委托(delegate),它接受一个 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 + " * ";
});

举例说明这是如何工作的,第一次调用委托(delegate)时,Match 参数将匹配字符串 "3"。在这种情况下,委托(delegate)被定义为将匹配本身作为与 "* " 连接的字符串返回。所以第一个 "3" 被替换为 "3 * "

该过程以这种方式继续,对原始字符串中的每个匹配项调用一次委托(delegate)。

关于c# - Regex.Replace 中的 MatchEvaluator 如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2587866/

相关文章:

c# - 如何使用 ASP.NET 动态创建文本框,然后将它们的值保存在数据库中?

c# - Web 引用代理是指定的字段

c# - 如果我想使用 ASP.NET MVC4 创建 ApiKey 受限资源,我应该使用 IAuthorizationFilter 吗?

regex - 。+之间有区别(如果有)。和。*

java - 基本实现的正则表达式模式匹配行为

c# - 如何绕过 FormClosing 事件

C# 句柄强制关闭套接字连接

C# 正则表达式包含 []

c# - 如何序列化原始 json 字段?

C# MySQL 连接问题