如何在Perl中捕获所有量化的正则表达式匹配?

如何在Perl中捕获所有量化的正则表达式匹配?,perl,Perl,如果regex是一个正则表达式,我可以像这样捕获它的两个重复: if (/(regex)(regex)/) { print $1; print $2; } my $string = "barfaafeebarbarfiifoo"; my @matches = ( $string =~ /f../g ); for my $match ( @matches ) { say "$match"; } 但这是糟糕的Perl,因为应该使用{2}量词,而糟糕的通用编程风格是重复代

如果
regex
是一个正则表达式,我可以像这样捕获它的两个重复:

if (/(regex)(regex)/) {
    print $1;
    print $2;
}
my $string = "barfaafeebarbarfiifoo";
my @matches = ( $string =~ /f../g );
for my $match ( @matches ) { 
    say "$match";
}
但这是糟糕的Perl,因为应该使用
{2}
量词,而糟糕的通用编程风格是重复代码。所以我想这样做:

if (/(regex){2}/) {
    print $1;
    print $2;
}
但这不起作用,只有第一个匹配的指纹


有没有一种方法可以同时打印两个匹配项而不重复代码?

您到底想实现什么?您可以打印匹配的整个零件:

if (/((regex){2})/) {
    print $1;
}
或者您可以尝试在
/g
期间多次使用
进行匹配<代码>\G
将确保匹配之间没有字符

while (/\G(regex)/g) {
    print $1;
}

你到底想达到什么目的?您可以打印匹配的整个零件:

if (/((regex){2})/) {
    print $1;
}
或者您可以尝试在
/g
期间多次使用
进行匹配<代码>\G
将确保匹配之间没有字符

while (/\G(regex)/g) {
    print $1;
}

你到底想达到什么目的?您可以打印匹配的整个零件:

if (/((regex){2})/) {
    print $1;
}
或者您可以尝试在
/g
期间多次使用
进行匹配<代码>\G
将确保匹配之间没有字符

while (/\G(regex)/g) {
    print $1;
}

你到底想达到什么目的?您可以打印匹配的整个零件:

if (/((regex){2})/) {
    print $1;
}
或者您可以尝试在
/g
期间多次使用
进行匹配<代码>\G
将确保匹配之间没有字符

while (/\G(regex)/g) {
    print $1;
}

如果您不关心哪个正则表达式匹配,则可以通过这种方式将多个正则表达式连接在一起:

if ( $s =~ m!(regexp1|regexp2|regexp3)! ){
  print "found $1\n";
}
如果你真的关心哪一个匹配,我会这样做:

foreach my $r ( 'regexp1','regexp2'){
    if ( $s =~ m!$r! ){
      print "$r matched: found $1 in $s\n";
    }
}

如果您不关心哪个正则表达式匹配,则可以通过这种方式将多个正则表达式连接在一起:

if ( $s =~ m!(regexp1|regexp2|regexp3)! ){
  print "found $1\n";
}
如果你真的关心哪一个匹配,我会这样做:

foreach my $r ( 'regexp1','regexp2'){
    if ( $s =~ m!$r! ){
      print "$r matched: found $1 in $s\n";
    }
}

如果您不关心哪个正则表达式匹配,则可以通过这种方式将多个正则表达式连接在一起:

if ( $s =~ m!(regexp1|regexp2|regexp3)! ){
  print "found $1\n";
}
如果你真的关心哪一个匹配,我会这样做:

foreach my $r ( 'regexp1','regexp2'){
    if ( $s =~ m!$r! ){
      print "$r matched: found $1 in $s\n";
    }
}

如果您不关心哪个正则表达式匹配,则可以通过这种方式将多个正则表达式连接在一起:

if ( $s =~ m!(regexp1|regexp2|regexp3)! ){
  print "found $1\n";
}
如果你真的关心哪一个匹配,我会这样做:

foreach my $r ( 'regexp1','regexp2'){
    if ( $s =~ m!$r! ){
      print "$r matched: found $1 in $s\n";
    }
}

您需要在整个表达式(包括量词)周围加上括号,如
/((regex){2})/
。但是,由于不需要内部捕获,因此最好使用非捕获括号
(?:…)
,这样代码看起来就像

if ( /((?:regex){2})/ ) {
  print $1;
}

您需要在整个表达式(包括量词)周围加上括号,如
/((regex){2})/
。但是,由于不需要内部捕获,因此最好使用非捕获括号
(?:…)
,这样代码看起来就像

if ( /((?:regex){2})/ ) {
  print $1;
}

您需要在整个表达式(包括量词)周围加上括号,如
/((regex){2})/
。但是,由于不需要内部捕获,因此最好使用非捕获括号
(?:…)
,这样代码看起来就像

if ( /((?:regex){2})/ ) {
  print $1;
}

您需要在整个表达式(包括量词)周围加上括号,如
/((regex){2})/
。但是,由于不需要内部捕获,因此最好使用非捕获括号
(?:…)
,这样代码看起来就像

if ( /((?:regex){2})/ ) {
  print $1;
}
我想在Perl中多次匹配正则表达式并打印所有匹配项

这不是你的程序正在做的。您的程序所做的是无论
regex
是什么,它必须是连续两次。
{..}
用于指定您想要某物的次数:

if ( $string =~ /a{2,3}/ ) {
     say "The string '$string' has two or three 'a' in a row";
}
然而,您似乎要问的是,每次
$regex
都是在字符串中出现的。您可以将匹配项保存在如下数组中:

if (/(regex)(regex)/) {
    print $1;
    print $2;
}
my $string = "barfaafeebarbarfiifoo";
my @matches = ( $string =~ /f../g );
for my $match ( @matches ) { 
    say "$match";
}
这将打印出:

faa
fee
fii
foo
如果正则表达式
/f../
没有匹配项,则不会打印任何内容。我可以通过查看
@matches
的标量值并查看它是否大于零来测试是否发生了匹配

注意:在本例中,我需要正则表达式末尾的
g

我想在Perl中多次匹配正则表达式并打印所有匹配项

这不是你的程序正在做的。您的程序所做的是无论
regex
是什么,它必须是连续两次。
{..}
用于指定您想要某物的次数:

if ( $string =~ /a{2,3}/ ) {
     say "The string '$string' has two or three 'a' in a row";
}
然而,您似乎要问的是,每次
$regex
都是在字符串中出现的。您可以将匹配项保存在如下数组中:

if (/(regex)(regex)/) {
    print $1;
    print $2;
}
my $string = "barfaafeebarbarfiifoo";
my @matches = ( $string =~ /f../g );
for my $match ( @matches ) { 
    say "$match";
}
这将打印出:

faa
fee
fii
foo
如果正则表达式
/f../
没有匹配项,则不会打印任何内容。我可以通过查看
@matches
的标量值并查看它是否大于零来测试是否发生了匹配

注意:在本例中,我需要正则表达式末尾的
g

我想在Perl中多次匹配正则表达式并打印所有匹配项

这不是你的程序正在做的。您的程序所做的是无论
regex
是什么,它必须是连续两次。
{..}
用于指定您想要某物的次数:

if ( $string =~ /a{2,3}/ ) {
     say "The string '$string' has two or three 'a' in a row";
}
然而,您似乎要问的是,每次
$regex
都是在字符串中出现的。您可以将匹配项保存在如下数组中:

if (/(regex)(regex)/) {
    print $1;
    print $2;
}
my $string = "barfaafeebarbarfiifoo";
my @matches = ( $string =~ /f../g );
for my $match ( @matches ) { 
    say "$match";
}
这将打印出:

faa
fee
fii
foo
如果正则表达式
/f../
没有匹配项,则不会打印任何内容。我可以通过查看
@matches
的标量值并查看它是否大于零来测试是否发生了匹配

注意:在本例中,我需要正则表达式末尾的
g

我想在Perl中多次匹配正则表达式并打印所有匹配项

这不是你的程序正在做的。您的程序所做的是无论
regex
是什么,它必须是连续两次。
{..}
用于指定您想要某物的次数:

if ( $string =~ /a{2,3}/ ) {
     say "The string '$string' has two or three 'a' in a row";
}
然而,您似乎要问的是,每次
$regex
都是在字符串中出现的。你可以保存比赛