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
-组1:一个或多个单词字符(\w+)
- 也许是这样
它使用嵌套在另一个替换中的替换。外部替换查找参数列表,而内部替换在列表中的每个参数后添加
: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) {