5

我以为我在合理程度上理解 Perl RE,但这让我感到困惑:

#!/usr/bin/perl
use strict;
use warnings;

my $test = "'some random string'";

if($test =~ /\'?(.*?)\'?/) {
       print "Captured $1\n";
       print "Matched $&";
}
else {
       print "What?!!";
}

印刷

捕获
的匹配 '

似乎它与结尾 ' 单独匹配,因此没有捕获任何内容。
我原以为它会匹配整个事物,或者如果它完全不贪婪,则什么都没有(因为所有事物都有一个可选匹配)。
这中间的行为让我感到困惑,谁能解释发生了什么?

4

5 回答 5

15

\'?开头和结尾的意思是贪婪地匹配 0 或 1 撇号。(正如另一位海报所指出的那样,为了使其不贪婪,它必须是\'??

中间.*?的意思是非贪婪地匹配 0 个或多个字符

Perl 正则表达式引擎将查看字符串的第一部分。它将匹配开头,但如此贪婪,所以它拿起第一个撇号。然后它以非贪婪方式匹配(因此尽可能少地匹配),然后是一个可选的撇号。这与空字符串匹配。

于 2009-04-03T08:19:03.840 回答
3

pattern?是贪婪的,如果你想让它不贪婪,你必须说pattern??

#!/usr/bin/perl
use strict;
use warnings;

my $test = "'some random string'";

if($test =~ /\'?(.*?)\'?/) {
       print "Captured [$1]\n";
       print "Matched  [$&]\n";
}
if($test =~ /\'??(.*?)\'??/) {
       print "Captured [$1]\n";
       print "Matched  [$&]\n";
}

来自 perldoc perlre:

识别以下标准量词:

*      Match 0 or more times
+      Match 1 or more times
?      Match 1 or 0 times
{n}    Match exactly n times
{n,}   Match at least n times
{n,m}  Match at least n but not more than m times

默认情况下,量化的子模式是“贪婪的”,也就是说,它会尽可能多地匹配(给定一个特定的起始位置),同时仍然允许模式的其余部分匹配。如果您希望它匹配尽可能少的次数,请在量词后面加上“?”。请注意,含义不会改变,只是“贪婪”:

*?     Match 0 or more times
+?     Match 1 or more times
??     Match 0 or 1 time
{n}?   Match exactly n times
{n,}?  Match at least n times
{n,m}? Match at least n but not more than m times
于 2009-04-03T07:57:03.720 回答
3

我认为你的意思是:

/'(.*?)'/      // matches everything in single quotes

或者

/'[^']*'/      // matches everything in single quotes, but faster

单引号不需要转义,AFAIK。

于 2009-04-03T07:57:21.130 回答
1

注意不要让你的正则表达式的所有元素都是可选的(即所有元素都用 * 或 ? 量化)。这让 Perl 正则表达式引擎可以尽可能多地匹配(甚至不匹配),同时仍然认为匹配成功。

我怀疑你想要的是

/'(.*?)'/
于 2009-04-03T07:58:56.383 回答
1

我想说最接近您正在寻找的答案是

/'?([^']*)'?/

因此,“如果存在则获取单引号”,“获取不是单引号的任何内容”,“如果存在则获取最后一个单引号”。

除非你想匹配“'don't do this'” - 但是谁在单引号中使用撇号(并且长期使用它)?:)

于 2009-04-16T19:33:19.383 回答