Regex perl正则表达式匹配,为什么不能找到所有匹配,为什么顺序很重要?

Regex perl正则表达式匹配,为什么不能找到所有匹配,为什么顺序很重要?,regex,perl,Regex,Perl,我遇到了perl的正则表达式匹配问题。我把它归结为命令行上的一个小示例。为什么尝试匹配的顺序在这里很重要 一, 二, 1。示例按预期匹配所有三个字母,但第二个示例与字母G不匹配,为什么 但是,如果我创建一个中间变量,在这里命名为$aa: $ echo "GXY" | perl -ne 'if ($_ =~ m/X/gi) { print "Matches X\n"; } ; if ($_ =~ m/Y/gi) { print "Matches Y\n"; } ; $aa = $_; if ($a

我遇到了perl的正则表达式匹配问题。我把它归结为命令行上的一个小示例。为什么尝试匹配的顺序在这里很重要

一,

二,

1。示例按预期匹配所有三个字母,但第二个示例与字母G不匹配,为什么

但是,如果我创建一个中间变量,在这里命名为$aa:

$ echo "GXY" | perl -ne 'if ($_ =~ m/X/gi) { print "Matches X\n"; } ; if ($_ =~ m/Y/gi) { print "Matches Y\n"; } ; $aa = $_; if ($aa =~ m/G/gi) { print "Matches G\n"; } '
Matches X
Matches Y
Matches G
那么比赛又开始了

我的perl版本是:

$ perl -e 'print "$]\n";'
5.022001
在LM 18.2机器上

$ lsb_release -d

Description:    Linux Mint 18.2 Sonya
Ty+BR
Max.

因为如果在这样的标量上下文中匹配正则表达式,并且设置
g
标志(用于全局匹配),那么它是迭代的-这允许您在(m/somepattern/g){时执行
之类的操作,并多次触发它

这是因为
g
意味着:

g-在字符串中重复全局匹配模式

如果每次尝试时都重置它,则不会特别有用。但在数组上下文中也可以稍微不同地使用它:

my @matches = $str =~ m/(some_capture)/g; 
这将把它们都选进一个列表

但通过代码和regex调试:

#!/usr/bin/env perl

use strict;
use warnings;

use re 'debug';

$_ = 'GXY';
if   ( $_ =~ m/X/gi ) { print "Matches X\n"; }
if   ( $_ =~ m/Y/gi ) { print "Matches Y\n"; }
if   ( $_ =~ m/G/gi ) { print "Matches G\n"; }
else                  { print "No match on G\n"; }
你会(为了简洁起见)被剪掉:

第一场比赛“吃”了“GX”找到“X”,留下“Y”作为下一场比赛,但“G”比赛什么也没有

简单的解决方法是省略
g
标志,因为这样您会显式地说“匹配一次”,您将得到:

Matches X
Matches Y
Matches G
或者,您可以对字符类使用全局匹配:

$_ = 'GXY';

my @matches = m/([GYX])/g; #implicitly operates on $_
print "Match on $_\n" for @matches;

因为如果你在这样的标量上下文中匹配一个正则表达式,并且你设置了
g
标志(用于全局匹配),它是迭代的——这允许你在(m/somepattern/g){
时执行
之类的操作,并多次触发它

这是因为
g
意味着:

g-在字符串中重复全局匹配模式

如果每次尝试时都重置它,则不会特别有用。但在数组上下文中也可以稍微不同地使用它:

my @matches = $str =~ m/(some_capture)/g; 
这将把它们都选进一个列表

但通过代码和regex调试:

#!/usr/bin/env perl

use strict;
use warnings;

use re 'debug';

$_ = 'GXY';
if   ( $_ =~ m/X/gi ) { print "Matches X\n"; }
if   ( $_ =~ m/Y/gi ) { print "Matches Y\n"; }
if   ( $_ =~ m/G/gi ) { print "Matches G\n"; }
else                  { print "No match on G\n"; }
你会(为了简洁起见)被剪掉:

第一场比赛“吃”了“GX”找到“X”,留下“Y”作为下一场比赛,但“G”比赛什么也没有

简单的解决方法是省略
g
标志,因为这样您会显式地说“匹配一次”,您将得到:

Matches X
Matches Y
Matches G
或者,您可以对字符类使用全局匹配:

$_ = 'GXY';

my @matches = m/([GYX])/g; #implicitly operates on $_
print "Match on $_\n" for @matches;

简言之,无论模式或字符串是什么,正则表达式引擎都会尝试成功,并且在到达字符串结尾之前不会停止。简言之,无论模式或字符串是什么,正则表达式引擎都会尝试成功,并且在到达字符串结尾之前不会停止。Ty表示快速回答。Ty表示快速回答