试图理解这个perl正则表达式括号中的角色类?

时间:2011-11-07 17:19:14

标签: regex perl pattern-matching character-class

下面是我正在玩的剧本。使用下面的脚本,它将打印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?我以为它应该没事!

谢谢。

2 个答案:

答案 0 :(得分:3)

在正则表达式中,括号中的字符仅计算给定括号内一个字符的匹配项。换句话说,[\w\/\.]只匹配以下字符之一:

  1. 字母数字字符或"_"\w)。
  2. 正斜杠(\/ - 注意正斜杠需要转义,因为它被用作正则表达式开头和结尾的默认标记)
  3. 句点(\. - 再次转义,因为.表示除换行符之外的任何字符。
  4. 因为/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)
)
"