Perl正则表达式匹配错误

时间:2017-06-06 20:29:47

标签: regex perl

我有点困惑为什么这次搜索的输出只是大写字母T.不应该+操作符匹配整个单词" GREAT"?任何帮助表示赞赏。

my $content = "The 39 Steps - a GREAT book - colours_15";

    if($content =~ /([A-Z]+)/) {
        print "Matched $1\n";
    }
    else {
        print "No match\n";
    }

4 个答案:

答案 0 :(得分:6)

您打印的T是您的正则表达式找到的第一个大写字母。它是第一个T字词的The

如果要在较大的字符串中匹配所有出现的1+大写ASCII字母块,请使用带有g(" global")修饰符的模式:/[A-Z]+/g

#!/usr/bin/perl
use warnings;
use feature 'say';

$s = "The 39 Steps - a GREAT book - colours_15";
my @res = $s =~ /[A-Z]+/g;
say "@res";

请参阅online Perl demo打印T S GREAT

如果您想查找仅包含ALLCAPS字母的整个单词,请使用

/\b([A-Z]+)\b/

\b是一个单词边界,可确保整个单词匹配。

请注意,您也可以使用匹配2个或更多大写ASCII字母的GREAT正则表达式匹配/([A-Z]{2,})/,但带字边界的版本看起来更实用。

答案 1 :(得分:4)

正则表达式引擎从字符串的左侧开始。它试图匹配大写字母,至少一个和尽可能多的大写字母。这是来自max-width:100%的{​​{1}}。那是至少一个,然后就完成了。它甚至从未达到T

您可以看到,如果您使用The运行程序,则会启用regex debugging

GREAT

这将写入STDERR:

use re 'debug'

答案 2 :(得分:1)

试试这个。这将给你完美的结果。

my $ content =“39步 - 一本好书 - colours_15”;

if($content =~m /\b([A-Z]+)\b/){
    print "Matched $1\n";
}
else{
    print "No match\n";
}

答案 3 :(得分:0)

Perl正则表达式引擎是懒惰的。它将返回字符串中最左边的匹配项。一旦找到匹配,它就会停止寻找"更好的"匹配。

此代码的正则表达式引擎的内部对话可能是这样的:

  

好的,我们正在寻找一个或多个大写字母。是的,让我们开始看看这个字符串。第一个角色是什么?哦,首都' T'。那匹配。但我们正在寻找一个或多个角色,所以继续寻找。下一步是什么?一个小写的' h。好的,那不匹配。看起来我们已经完成了。我找到的一个或多个大写字母的第一个序列就是字母“T'”。坚持$1,看起来我们可以提前淘汰。谁打水壶?