重叠替换正则表达式



我有一个字符串

工作1工作2工作3工作4工作5

我想获得

工作1工作21工作321工作4321工作54321

我使用这个命令但是不工作

    (?<=works(d)+.)(work)(sd+)
    $2$3$1

问题是它不记录第一次发生后替换的信息,而可以在每次发生后保存更改。

当我应用命令时,我得到

work 1 work 21 work 32 work 43 work 54

您实际上不需要重叠的正则表达式匹配,您需要能够匹配每个work +空格+数字并保存数字值以便在每次迭代时更新。

regex被简化为仅work (?<num>d+)(匹配work,一个空格并捕获一个或多个数字到"num"组)。

Regex.Replace方法中使用回调方法:

using System;
using System.IO;
using System.Text.RegularExpressions;
using System.Linq;
public class Test
{
    public static string num = string.Empty;
    public static void Main()
    {
        var s = "work 1 work 2 work 3 work 4 work 5";
        Console.WriteLine(Regex.Replace(s, @"work (?<num>d+)", Repl));
    }
    public static string Repl(Match m)
    {
        num = m.Groups["num"].Value + num;
        return string.Format("work {0}", num);
    }
}

参见c#演示

您可以尝试Regex.Replace聚合匹配:

  String source = "work 1 work 2 work 3 work 4 work 5";
  String aggregate = "";
  // work 1 work 21 work 321 work 4321 work 54321
  String result = Regex.Replace(source, @"d+", // or  @"(?<=works)d+" pattern
    match => aggregate = match.Value + aggregate);

最新更新