【问题标题】:Overlap replace regex?重叠替换正则表达式?
【发布时间】:2016-07-02 17:25:53
【问题描述】:

我有一个字符串

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

我要获取

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

我使用了这个命令,但不起作用

    (?<=work\s(\d)+.)(work)(\s\d+)
    $2$3$1

问题是它不记录第一次出现后替换的信息,并且可以在每次出现后保存更改。

当我应用我得到的命令时

工作 1 工作 21 工作 32 工作 43 工作 54

【问题讨论】:

  • 你的编程语言是什么?
  • regex c# ,我用的是sharpdeveloper
  • 如果“work+digits”组的数量是可变的,则通过一次正则表达式传递是不可能的。
  • 问题是它不记录第一次出现后替换的信息,并且可以在每次出现后保存更改

标签: c# regex replace


【解决方案1】:

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

正则表达式被简化为仅work (?&lt;num&gt;\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# demo

【讨论】:

  • Dmitry 和 sln 建议使用聚合和匿名方法的相同解决方案。思路是一样的:使用MatchEvaluator委托来更新num变量。
【解决方案2】:

您可以在 聚合 匹配时尝试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  @"(?<=work\s)\d+" pattern
    match => aggregate = match.Value + aggregate);

【讨论】:

  • @zero625:所有答案(slnWiktor Stribiżew 的答案)都利用了相同的思想:正则表达式 + 聚合;然而,实现略有不同(答案使用 groups,当我在 @"(?&lt;=work\s)\d+" 模式中执行后看时;我更喜欢 lambda 而不是代表等)。所以类似的例子是其他答案
  • 在正则表达式性能方面,未锚定的后视有点昂贵,这就是为什么如果我可以使用捕获组,我总是喜欢远离它们。此外,匹配一位或零位数字的\d+ 正则表达式将匹配任何数字序列,而不仅仅是在“work”之后。 @zero625:顺便说一句,如果一个答案被证明有帮助,请始终考虑支持它。
猜你喜欢
  • 2021-01-26
  • 1970-01-01
  • 1970-01-01
  • 2018-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-30
相关资源
最近更新 更多