Regex Perl正则表达式捕获到数组中
为什么该代码:Regex Perl正则表达式捕获到数组中,regex,perl,Regex,Perl,为什么该代码: my $text = "!a!b!c!"; my @captures = ($text =~ /!(.)!/g); print "$_\n" foreach @captures; 仅输出 a c ? 预期产出: a b c 如何捕获所有这些内容?为了不消耗第二个,您需要使用前瞻并将其保留到下一个正则表达式引擎迭代: /!(.)(?=!)/g 首先,匹配,则除了紧靠前面的换行符以外的任何符号都匹配如果未使用,则正则表达式引擎索引将保持在其前面。因此,下一个匹配可以从这个开始
my $text = "!a!b!c!";
my @captures = ($text =~ /!(.)!/g);
print "$_\n" foreach @captures;
仅输出
a
c
?
预期产出:
a
b
c
如何捕获所有这些内容?为了不消耗第二个
,您需要使用前瞻代码>并将其保留到下一个正则表达式引擎迭代:
/!(.)(?=!)/g
首先,
匹配,则除了紧靠前面的换行符以外的任何符号都匹配代码>如果未使用,则正则表达式引擎索引将保持在其前面。因此,下一个匹配可以从这个开始代码>
更新代码:
my $text = "!a!b!c!";
my @captures = ($text =~ /!(.)(?=!)/g);
print "$_\n" foreach @captures;
输出:
a
b
c
使用进行拆分代码>可以在当前发布的场景中产生更有效的替代方案:
my $text = "!a!b!c!";
my @matches = grep /\S/, split "!", $text;
print "$_\n" foreach @matches;
请注意,grep/\S/
将从使用split
获取的数组中删除空的或仅空白的元素。请使用前瞻,以避免使用第二个代码>:($text=~/!(?=!)/g)代码>。但是,您的代码不仅输出a
和c
,而且还输出a
。为什么不直接执行my@matches=split“!”、“!a!b!c!”
@hwnd在试图更好地理解捕获时,这只是一个抽象问题,但您的方法也很有用thanks@stribizhev非常感谢。我希望它输出“a\nc\n”。在这里测试,这就是我得到的。这真的是你正在运行的代码吗?你真的没有得到“c”吗?如果是:您使用的是什么版本的perl,以及如何运行此代码?