【问题标题】:Regexp: replace multiple groups with unknown groups number正则表达式:用未知组号替换多个组
【发布时间】:2018-01-07 01:32:47
【问题描述】:

假设我要替换

function (foo, bar, some, other) {

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

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

它可能类似于/function \((\S+),?\) \{/g,但我猜有不同数量的捕获组......

这是一种用 Perl-styled RegEx

替换所有匹配项的方法吗

附:我没有找到基于 rexex 的解决方案,但我需要正则表达式

【问题讨论】:

    标签: regex shell perl


    【解决方案1】:

    您可以使用基于 \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 组:一个或多个单词字符。

    【讨论】:

    • 太棒了!非常感谢。所以正则表达式是(?:\G(?!\A),?|function\s*\()\s*\K(\w+)。奇迹般有效。几分钟后我会接受这个答案
    • 是否可以检查它是否以{character 关闭?抱歉,但这对我来说可能很重要。 (我试图在表达式的最后添加类似(?:\)\s\{) 的东西,但这是完全错误的))
    • @SergeyPanfilov:是的,当然,抱歉,这让我没有注意。只需在开头添加前瞻:function\s*\( 必须替换为 function\s*\((?=[^)]*\)\s*{) 或者甚至可能像 function\s*\((?=.*?\)\s*{)
    【解决方案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) {
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-09
      • 1970-01-01
      • 2015-07-25
      • 2012-08-01
      • 1970-01-01
      • 2012-03-01
      • 2016-11-12
      相关资源
      最近更新 更多