正则表达式:替换具有未知组号的多个组

时间:2017-07-31 12:55:05

标签: regex shell perl

假设我要替换

function (foo, bar, some, other) {

function (foo:any, bar:any, some:any, other:any) {

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

它可能会像/function \((\S+),?\) \{/g那样,但是有不同数量的捕获组,我猜......

是否可以用 Perl风格的RegEx替换所有匹配

P.S。我没有找到基于rexex的解决方案,但我需要完全正则表达式

2 个答案:

答案 0 :(得分:3)

您可以使用基于\G的正则表达式替换单个正则表达式:

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;

查看online Perl demo

模式详情

  • (?:\G(?!\A),?|function\s*\() - 上一次成功匹配的结束和可选的,(与\G(?!\A),?匹配)或(|function子字符串后跟0 +空格,然后是文字((与function\s*\(匹配)
  • \s* - 零个或多个空格
  • \K - 匹配重置运算符,丢弃与匹配缓冲区匹配的整个文本
  • (\w+) - 第1组:一个或多个单词字符。

答案 1 :(得分:2)

或许这样吗?

它使用嵌套在另一个替换中的替换。外部的一个找到参数列表,而内部的一个在列表

中的每个参数之后添加: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;

输出

function (foo:any, bar:any, some:any, other:any) {