【问题标题】:Regex search and replace where the replacement is a mod of the search term正则表达式搜索和替换,其中替换是搜索词的模式
【发布时间】:2010-11-19 03:34:19
【问题描述】:

我很难找到解决方案,我很确定正则表达式支持它。我只是想不起正则表达式世界中这个概念的名称。

我需要搜索和替换特定模式的字符串,但模式可能不同,替换需要“记住”它正在替换的内容。

例如,假设我有一个任意字符串:134kshflskj9809hkj

我想用括号括住数字, 所以结果是:(134)kshflskj(9809)hkj

找数字很简单,但是如何包围它们呢?

谁能提供样本或指出正确的方向?

【问题讨论】:

  • 您使用什么语言?顺便说一句,这个概念被称为反向引用:regular-expressions.info/brackets.html
  • C#,但故意忽略了这个事实。我很好奇如何使用“通用”正则表达式来做到这一点。感谢反向引用内存慢跑。没错。
  • Regex 与语言无关。对于 Perl 和 .NET 的正则表达式替换字符串的实现,第一组为 1 美元,第二组为 2 美元,依此类推。但该方案在所有实现中并不是一个硬性规定。
  • 您可以在这里regexhero.net/tester 尝试工具中的替换功能,如果您需要,它甚至会为您生成必要的 C# 代码。

标签: c# regex


【解决方案1】:

在一些不同的语言中:

// C#:
string result = Regex.Replace(input, @"(\d+)", "($1)");
// JavaScript:
thestring.replace(/(\d+)/g, '($1)');
// Perl:
s/(\d+)/($1)/g;
// PHP:
$result = preg_replace("/(\d+)/", '($1)', $input);

(\d+) 周围的括号使它成为一个“组”,特别是第一个(并且仅在这种情况下)组,它可以是替换字符串中的backreferenced。在某些实现中需要g 标志以使其在单个字符串中多次匹配)。替换字符串非常相似,尽管有些语言会使用 \1 而不是 $1,有些语言会同时使用两者。

【讨论】:

    【解决方案2】:

    大多数正则表达式替换函数允许您在定义替换字符串时引用正则表达式中指定的捕获组(也称为反向引用)。例如,使用 PHP 中的preg_replace()

    $var = "134kshflskj9809hkj";
    $result = preg_replace('/(\d+)/', '(\1)', $var);
    
    // $result now equals "(134)kshflskj(9809)hkj"
    

    其中\1 表示“正则表达式中的第一个捕获组”。

    【讨论】:

      【解决方案3】:

      另一个有点通用的解决方案是:

      搜索:/([\d]+)([^\d]*)/g
      替换:($1)$2

      ([\d]+):匹配一组一个或多个数字并将它们保留在一个组中
      ([^\d]*):匹配一组非数字,并保留它们。 \D 也可以在这里工作。
      g:表示这是一个全局表达式,可以在输入上多次工作。

      ($1):replace块中,parens没有特殊含义,所以输出第一组,用parens包围。
      $2:输出第二组

      我使用pretty good online regex tool 来测试我的表情。下一步是将其应用于您正在使用的语言,因为每种语言都有自己的实现细微差别。

      【讨论】:

        【解决方案4】:

        如果您只是想搜索数字并用括号括起来的正则表达式替换,则不需要反向引用(分组)。在替换字符串中使用整个正则表达式匹配更简单。

        例如对于 perl

        $text =~ s/\d+/($&)/g;
        

        这会搜索 1 个或多个数字并替换为匹配项周围的括号(由 $& 指定),尾随 g 以查找和替换所有匹配项。

        请参阅http://www.regular-expressions.info/refreplace.html,了解您的正则表达式语言的正确语法。

        【讨论】:

          【解决方案5】:

          根据您的语言,您正在寻找匹配组。

          所以通常你会以

          的形式制作一个模式
          ([0-9]{1,})|([a-zA-Z]{1,})
          

          然后,您将迭代生成的组(特定于您的语言)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-06-14
            • 2018-05-25
            • 2010-11-25
            • 2010-10-30
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多