regex 正则表达式捕获上次匹配后的剩余语句

x33g5p2x  于 2023-03-13  发布在  其他
关注(0)|答案(2)|浏览(76)

假设我有一个句子,我想根据某些标记的外观来匹配(并最终替换,但这不是问题的一部分)它们:
The quick brown fox {NUM} jumped over {211NUM} the lazy dog {NUM}. The Quick brown fox {NUM10} jumped over the lazy dog.
我想根据#中的逻辑和数字替换{NUM}{#NUM}{NUM#}部分,然后将它们作为单个字符串放回一起。
我想出了
(.*?)({NUM}|{\d*NUM}|{NUM\d*})
这将获得我想要的捕获,但我似乎不知道如何获得最后一次匹配后句子的剩余部分,即jumped over the lazy dog.
我想也许在最后添加(.*?)可以做到这一点,但事实并非如此。以下是我的工作:
https://regex101.com/r/HpIcAa/1

8wtpewkr

8wtpewkr1#

不需要垃圾回收器与拆分/合并字符串。替换工作良好,没有内存峰值,快速,接受函数作为参数了:

public class Program
{
    public static void Main()
    {
        var pattern = @"(?<num>\{((?<n1>\d+)?NUM|NUM(?<n2>\d+))\})";
        var regx = new Regex(pattern, RegexOptions.ExplicitCapture | RegexOptions.Multiline);
        var input =
            @"The quick brown fox {NUM} jumped over {211NUM} the lazy dog {NUM}.  The Quick brown fox {NUM10} jumped over the lazy dog. ";

        var output = regx.Replace(input, ToReplaceMatch);
        Console.WriteLine(output);
    }

    private static string ToReplaceMatch(Match match)
    {
        if (match.Groups["num"].Success)
        {
            var num = int.TryParse(match.Groups["n1"].Value ?? match.Groups["n2"].Value, out var res)
                ? res
                : (int?)null;
            return ToReplaceNum(num);
        }

        return match.Value;
    }

    private static string ToReplaceNum(int? number)
    {
        return "FOOBAR" + (number ?? 0);
    }
}

输出:

The quick brown fox FOOBAR0 jumped over FOOBAR211 the lazy dog FOOBAR0.  The Quick brown fox FOOBAR0 jumped over the lazy dog.
juud5qan

juud5qan2#

您可以尝试使用以下正则表达式模式只匹配您的关键字:(?<g1>{NUM})|(?<g2>{\d*NUM})|(?<g3>{NUM\d*})
然后使用Regex.Replace函数根据您的逻辑替换关键字。

string pattern = @"(?<g1>{NUM})|(?<g2>{\d*NUM})|(?<g3>{NUM\d*})";
string input = "The quick brown fox {NUM} jumped over {211NUM} the lazy dog {NUM}.  The Quick brown fox {NUM10} jumped over the lazy dog. ";
output = Regex.Replace(input, pattern, delegate(Match match)
{
    if (match.Groups["g1"].Success)
    {
       return "{Group 1}";
    }
    if (match.Groups["g2"].Success)
    {
       return "{Group 2}";
    }
    if (match.Groups["g3"].Success)
    {
       return "{Group 3}";
    }
    return match.Value;
});

参见here演示

相关问题