使用全局切换的perl正则表达式匹配

时间:2017-12-04 16:43:07

标签: regex perl

我正在尝试匹配一个以字母开头的单词,然后是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个字符时。

1 个答案:

答案 0 :(得分:2)

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

使用字边界构造\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;

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