匹配perl regexp中的第一个结束括号

时间:2017-06-19 14:36:29

标签: regex perl

我有以下正则表达式:

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,'');

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

我哪里错了?

2 个答案:

答案 0 :(得分:1)

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

解决方案:

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

[^,)]

答案 1 :(得分:-1)

简单的解决方案是从)的参数列表中排除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+