下面是我正在玩的剧本。使用下面的脚本,它将打印a
$tmp = "cd abc/test/.";
if ( $tmp =~ /cd ([\w\/\.])/ ) {
print $1."\n";
}
但如果我将其更改为:
$tmp = "cd abc/test/.";
if ( $tmp =~ /cd ([\w\/\.]+)/ ) {
print $1."\n";
}
然后打印:cd abc/test/.
根据我的理解,+匹配一个或多个匹配序列,请纠正我,如果我错了请。但为什么在第一种情况下它只匹配a
?我以为它应该没事!
谢谢。
答案 0 :(得分:3)
在正则表达式中,括号中的字符仅计算给定括号内一个字符的匹配项。换句话说,[\w\/\.]
只匹配以下字符之一:
"_"
(\w
)。\/
- 注意正斜杠需要转义,因为它被用作正则表达式开头和结尾的默认标记)\.
- 再次转义,因为.
表示除换行符之外的任何字符。 因为/cd ([\w\/\.])./
只会将一个字符捕获到$1
,所以它会抓取第一个字符,在本例中为"a"
。
你是正确的,因为+
允许匹配一个或多个这样的字符。由于正则表达式默认情况下贪婪地匹配,因此您应该在第二场比赛中获得"abc/test/."
的所有$1
。
如果您还没有这样做,可能需要仔细阅读perldoc perlretut
。
答案 1 :(得分:3)
你是对的。在第一种情况下,您匹配该字符类中的单个字符,而在第二种情况下,您匹配至少一个字符,并在第一个字符后匹配尽可能多的字符。
第一个:
"
cd\ # Match the characters “cd ” literally
( # Match the regular expression below and capture its match into backreference number 1
[\w\/\.] # Match a single character present in the list below
# A word character (letters, digits, etc.)
# A / character
# A . character
)
"
第二个:
"
cd\ # Match the characters “cd ” literally
( # Match the regular expression below and capture its match into backreference number 1
[\w\/\.] # Match a single character present in the list below
# A word character (letters, digits, etc.)
# A / character
# A . character
+ # Between one and unlimited times, as many times as possible, giving back as needed (greedy)
)
"