Regexp:用未知组号替换多个组

Regexp:用未知组号替换多个组,regex,shell,perl,Regex,Shell,Perl,比如说,我想替换 function (foo, bar, some, other) { 与 重要提示:我不知道函数可能有多少个参数 它可能会像/function\(\s+),\{/g一样,但我想,有很多捕获组 这是一种用Perl样式的正则表达式替换所有匹配项的方法吗 另外,我没有找到基于rexex的解决方案,但我需要的正是regex您可以使用基于\G的regex使用单个regex替换: use strict; use warnings; my $s = 'function (foo, bar

比如说,我想替换

function (foo, bar, some, other) {

重要提示:我不知道函数可能有多少个参数

它可能会像
/function\(\s+),\{/g
一样,但我想,有很多捕获组

这是一种用Perl样式的正则表达式替换所有匹配项的方法吗


另外,我没有找到基于rexex的解决方案,但我需要的正是regex

您可以使用基于
\G
的regex使用单个regex替换:

use strict;
use warnings;

my $s = 'function (foo, bar, some, other) {';
$s =~ s/(?:\G(?!\A),?|function\s*\()\s*\K(\w+)/$1:any/g;
print $s;

图案细节

  • (?:\G(?!\A),?\function\s*()
    -上一次成功匹配的结尾和可选的
    (匹配
    \G(?!\A),?
    )或(
    函数
    子字符串,后跟0+空格,然后是一个文本
    (匹配
    函数*\(
  • \s*
    -零个或多个空格
  • \K
    -匹配重置操作符丢弃匹配缓冲区中迄今为止匹配的全部文本
  • (\w+)
    -组1:一个或多个单词字符
    • 也许是这样

      它使用嵌套在另一个替换中的替换。外部替换查找参数列表,而内部替换在列表中的每个参数后添加
      :any

      use strict;
      use warnings 'all';
      use feature 'say';
      
      my $s = 'function (foo, bar, some, other) {';
      
      $s =~ s{\bfunction\s*\(\K([^()]+)}{
          my $params = $1;
          $params =~ s/[^\s,]+\K/:any/gr;
      }eg;
      
      say $s;
      
      输出
      太好了!非常感谢。所以现在的regexp应该是
      (?:\G(?!\A),?\function\s*\()\s*\K(\w+)
      。工作起来很有魅力。几分钟后我会接受这个答案。是否可以检查它是否以
      {
      字符关闭?对不起,但它对我来说可能很重要。(我已经尝试添加了类似
      (?:\)\s\{)
      在表达式的最后,但它是完全错误的”)@SergeyPanfilov:是的,当然,对不起,这没有引起我的注意。只需在开头加上前瞻:
      function\s*\(
      必须替换为
      function\s*(?=[^)]*\ \s*{
      或者甚至类似于
      function\s*\(?=*)\s*{/code>。
      
      use strict;
      use warnings 'all';
      use feature 'say';
      
      my $s = 'function (foo, bar, some, other) {';
      
      $s =~ s{\bfunction\s*\(\K([^()]+)}{
          my $params = $1;
          $params =~ s/[^\s,]+\K/:any/gr;
      }eg;
      
      say $s;
      
      function (foo:any, bar:any, some:any, other:any) {