Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Perl正则表达式捕获到数组中_Regex_Perl - Fatal编程技术网

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,以及如何运行此代码?