c# - 处理未知数量的捕获组时仅替换一组

标签 c# regex

假设我有这个输入:

/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/

相关文章:

c# - 来自字典 C# 的数组

c# - CheckBoxFor 的 MVC 3 自定义 ValidationAttribute 在客户端触发两次

java - Java 中的正则表达式反向引用

MySql REGEXP 匹配两个逗号分隔的字符串

c# - 如何从进程中获取输出?

c# - 如何在自己的客户端-服务器应用程序中使用 System.IdentityModel

javascript - 如何使用 jQuery 或 javascript 修改 URL 结尾?

php - 使用 PHP 正则表达式匹配字符串中的任何 Unicode 空白字符

java - 使用正则表达式检查字符串是否以数字字符开头和结尾

c# - 使用 C# 通过套接字发送和接收图像