假设我有这个输入:
/green/blah/agriculture/apple/blah/
我只是想捕获并替换 apple 的出现(需要将其替换为 Orange),所以我有这个正则表达式
var regex = new Regex("^/(?:green|red){1}(?:/.*)+(apple){1}(?:/.*)");
因此,我对输入的各个部分进行分组,但作为非捕获,并且仅捕获我关心的部分。根据this $` 将检索输入字符串中匹配项之前的所有内容,而 $' 将获取输入字符串中匹配项之后的所有内容,因此理论上以下内容应该有效:
"$`Orange$'"
但它只检索匹配项(“apple”)。
是否可以仅通过替换和不匹配评估器并循环组来实现此目的?
问题是 apple 可能出现在该 url 方案中的任何位置,因此捕获组的数量未知。
谢谢。
最佳答案
为了实现你想要的,我稍微改变了你的正则表达式。
新的正则表达式如下所示在答案末尾查找更新版本:
我在这里所做的是,我希望所有其他组都成为捕获组。这样做我可以按如下方式使用它们:
String replacement = "$1Orange$2";
string result = Regex.Replace(text, regex.ToString(), replacement);
我正在使用组 1,2 和 4,并且在所有内容的中间(我怀疑是“苹果”),我将其替换为 Orange
。
完整的示例如下所示:
using System;
using System.Text.RegularExpressions;
public class Test
{
public static void Main()
{
String text = "/green/blah/agriculture/apple/blah/hallo/apple";
var regex = new Regex("^(/(?:green|red)/(?:[^/]+/)*?)apple(/.*)");
String replacement = "$1$2Orange$4";
string result = Regex.Replace(text, regex.ToString(), replacement);
Console.WriteLine(result);
}
}
还有一个正在运行的示例是 here
查看更新后的正则表达式,我需要再次更改它以捕获如下内容:
/green/blah/agriculture/apple/blah/hallo/apple/green/blah/agriculture/apple/blah/hallo/apple
使用上面的正则表达式,它匹配最后一个苹果,而不是指定 prio 的第一个苹果。我将正则表达式更改为:
var regex = new Regex("^(/(?:green|red)/(?:[^/]+/)*?)apple(/.*)");
我更新了代码以及运行示例。
关于c# - 处理未知数量的捕获组时仅替换一组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36170942/