计数正则表达式替换(C#)

Sim*_*n D 17 .net c# regex replace

有没有办法计算Regex.Replace调用的替换次数?

例如,Regex.Replace("aaa", "a", "b");我想得到数字3(结果是"bbb"); 因为Regex.Replace("aaa", "(?<test>aa?)", "${test}b");我想得到数字2(结果是"aabab").

我能想到这样做的方式:

  1. 使用MatchEvaluator递增捕获的变量,手动执行替换
  2. 获取MatchCollection并迭代它,手动执行替换并保持计数
  3. 首先搜索并获取MatchCollection,从中获取计数,然后单独替换

方法1和方法2需要手动解析$替换,方法3需要正则表达式匹配字符串两次.有没有更好的办法.

Sim*_*n D 15

感谢Chevex和Guffa.我开始寻找更好的方法来获得结果,并发现Match类上有一个Result方法来进行替换.这是拼图中缺失的部分.示例代码如下:

using System.Text.RegularExpressions;

namespace regexrep
{
    class Program
    {
        static int Main(string[] args)
        {
            string fileText = System.IO.File.ReadAllText(args[0]);
            int matchCount = 0;
            string newText = Regex.Replace(fileText, args[1],
                (match) =>
                {
                    matchCount++;
                    return match.Result(args[2]);
                });
            System.IO.File.WriteAllText(args[0], newText);
            return matchCount;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

使用包含aaa的文件test.txt,命令行将regexrep test.txt "(?<test>aa?)" ${test}b%errorlevel%设置为2并将文本更改为aabab.


Guf*_*ffa 7

您可以使用MatchEvaluator为每次替换运行的那个,这样您就可以计算它发生的次数:

int cnt = 0;
string result = Regex.Replace("aaa", "a", m => {
  cnt++;
  return "b";
});
Run Code Online (Sandbox Code Playgroud)

第二种情况比较棘手,因为你必须产生与替换模式相同的结果:

int cnt = 0;
string result = Regex.Replace("aaa", "(?<test>aa?)", m => {
  cnt++;
  return m.Groups["test"] + "b";
});
Run Code Online (Sandbox Code Playgroud)