【问题标题】:Matching first end bracket in perl regexp匹配 perl 正则表达式中的第一个结束括号
【发布时间】:2017-06-19 14:36:29
【问题描述】:

我有以下正则表达式:

perl -pi -w -e "s/(\bgetnitemc)\(([^,]+),([^,]+)\)/\$1\(\$2,\$3,1,1,''\)/g;" d_*.sas

影响如下(git diff):

-               if getnitemc(l_sub2,'OBJTYPE') = 'SLIST' then
-                  l_tempa = insertc(l_tempa,getnitemc(l_sub2,'OBJNAME'));
+               if getnitemc(l_sub2,'OBJTYPE',1,1,'') = 'SLIST' then
+                  l_tempa = insertc(l_tempa,getnitemc(l_sub2,'OBJNAME'),1,1,'');

因此,第一行的行为按预期工作。但是,在第二行中,我尝试添加的部分 (,1,1,'') 应用于包装函数 (insertc) 而不是目标函数 (getnitemc)。如果你能明白我的意思,它有点“跳过括号”。

我哪里错了?

【问题讨论】:

    标签: regex perl


    【解决方案1】:

    找到了!所以我认为否定运算符 (^) 在捕获中包含了结束括号..

    解决方案:

    perl -pi -w -e "s/(\bgetnitemc)\(([^,]+),([^,)]+)\)/\$1\(\$2,\$3,1,1,''\)/g;" d_*.sas
    

    ([^,)])

    【讨论】:

      【解决方案2】:

      简单的解决方案是从getnitemc 的参数列表中排除)。匹配现有参数所需的只是[^)]*

      经过一番清理,你得到

      perl -i -wpe's/\b(getnitemc\([^)]*)/$1,1,1,\x27\x27/g' d_*.sas
      

      perl -i -wpe's/\bgetnitemc\([^)]*\K/,1,1,\x27\x27/g' d_*.sas   # 5.10+
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-03
        相关资源
        最近更新 更多