2010-10-02 97 views
0

以下内容做了什么?有人可以解释我吗?下面的代码是做什么的?

$data = "What is the STATUS of your mind right now?"; 

$data =~/.*/; print "$1,$2\n"; 

$data =~/(.*?)(u+).*/; print "$1, $2\n"; 

$data =~/(.?)(u+).*/; print "$1, $2\n"; 

$data =~/(\w+\s)+/; print "$1, $2\n"; 

什么是$1 and $2?这是如何得到它的价值的?这些正则表达式是什么?

感谢提前:)

回答

4

请阅读perldoc perlretut,这将回答您的问题。

Perl正则表达式的一般参考是perldoc perlre,但您应该首先阅读教程,因为它可以作为更好的介绍。

+0

OK但是,什么是$ 1和$ 2? – TCM 2010-10-02 17:39:12

+0

@Nitesh:该问题在链接到的文档的[提取匹配项](http://perldoc.perl.org/perlretut.html#Extracting-matches)部分中得到解答。 – Ether 2010-10-02 17:50:04

+0

@Nitesh:他们被称为反向引用。你有没有读过链接? – BoltClock 2010-10-02 17:50:24

0

$1$2是匹配的变量。它们指的是在最后一个正则表达式的各个括号匹配组中匹配的内容。

$1具有在第一个括号组中匹配的字符串部分。 $2具有在第二个括号组中匹配的字符串部分。你可以猜到$3将包含什么。

让我们看看你的例子:

$data = "What is the STATUS of your mind right now?"; 
$data =~/.*/; print "$1,$2\n"; 

这里没有括号,那么1 $ 2和$不包含任何东西。

$data =~/(.*?)(u+).*/; print "$1, $2\n"; 

这里有两个括号组。第一个是(.*?),它不匹配任何东西或任何可以匹配的东西(以非贪婪的方式,但这是另一个话题)。第二个是(u+),它匹配一个或多个*“u”* s。

第一个(也是唯一一个)的“u” $data是在中间的“你”,所以$1匹配万万直到第一“U”$2匹配一个“U”

$data =~/(.?)(u+).*/; print "$1, $2\n"; 

现在第一组是(.?),它匹配一个单个字符,或者什么都不匹配。然后(u+)再次匹配一个或多个*“u”* s。

由于只是一个“U”在我们的字符串,第一组会收到一个单个字符,这是“O”,第二组将与实际“U”

$data =~/(\w+\s)+/; print "$1, $2\n"; 

最后,第一组匹配(\w+\s)+,其是一个或多个“字”字符,随后是空白字符。 “字”字符是任何字母数字字符或下划线。没有第二组,但有+(一个或多个)符号。

那么它匹配了什么?这是一个奇怪的,我不确定我的理解是否100%准确。由于整个匹配组有+,它会吞噬尽可能多的字符串,并仍然匹配\w+\s。在这种情况下,它可以不顾一切,直到“右”,它然后作为$1匹配。

然后,因为它具有+,它会寻找任何更多的比赛随即,但自从“正确”是匹配的,它永远不会找到另一个小组赛中最右边的字符串。

所以$1是 “正确的”,并$2是空的。

摘要:

当你看到了$ 1,$ 2,你应该寻找在最后的正则表达式匹配的组括号。