Regex perl正则表达式匹配,为什么不能找到所有匹配,为什么顺序很重要?
我遇到了perl的正则表达式匹配问题。我把它归结为命令行上的一个小示例。为什么尝试匹配的顺序在这里很重要 一, 二, 1。示例按预期匹配所有三个字母,但第二个示例与字母G不匹配,为什么 但是,如果我创建一个中间变量,在这里命名为$aa: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
$ 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表示快速回答