繁体   English   中英

使用全局开关进行Perl正则表达式匹配

[英]perl regex match using global switch

我正在尝试匹配一个以字母开头的单词,然后是at。

我为此使用正则表达式

use strict;
use warnings;

use Data::Dumper;

my $str = "fat 123 cat sat on the mat";

my @a = $str =~ /(\s?[a-z]{1,2}(at)\s?)/g;

print Dumper( @a );

我得到的输出是:

$ perl ~/playground/regex.pl 
$VAR1 = 'fat ';
$VAR2 = 'at';
$VAR3 = ' cat ';
$VAR4 = 'at';
$VAR5 = 'sat ';
$VAR6 = 'at';
$VAR7 = ' mat';
$VAR8 = 'at';

当我清楚地说at之前只匹配1个字符时,为什么它也匹配“ at”。

您的可选空格不是分隔单词的好方法:它们是可选的

使用单词边界构造\\b粗略匹配单词的末尾

use strict;
use warnings;

use Data::Dumper;

my $str = "fat 123 cat sat on the mat";

my @aa = $str =~ /\b[a-z]+at\b/gi;

print Dumper \@aa;

输出

$VAR1 = [
          'fat',
          'cat',
          'sat',
          'mat'
        ];

如果您想变得更聪明,并且确定找到的单词前面或后面没有非空格字符,则可以改写为

my @aa = $str =~ /(?<!\S)[a-z]+at(?!\S)/gi;

与您显示的数据产生相同的结果

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM