簡體   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