我有点困惑为什么这次搜索的输出只是大写字母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";
}
答案 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
,看起来我们可以提前淘汰。谁打水壶?