分类: Python/Ruby
2012-03-31 10:37:50
当希望使用s" " "运算符或者用m" "运算符对一些复杂模式进行匹配很困难时,Perl提供了读者应意识到的有用功能。这个功能就是反向引用可以用于正则表达式自身。换句话说,如果用圆括号 括住一组字符,那么就可以在正则表达式结束之前使用反向引用。如果想在s" " "的第二部分中使用反向引用,那么要使用语法$1,$2等。如果想在m" "或者s" " "的第一部分使用反向引用,那么使用语法\1\2等。下面是一些例子:
$string = ' far out';
$string =~ s "(far)(out)" $2 $1"; # This makes string ' out far'.
我们在该例中只是将单词far out转换为out far。
$string = ' sample examples';
if ($string =~ m" (amp..) ex\1") {print " MATCHES!\n"; }
这个例子有点复杂。第—个模式(amp..)匹配字符串ample。这意味转整个模式成为字符串ample example,其中带下划线的文本对应于\1。因此,模式匹配的是 sample examples。
下面是同样风格更复杂的例子;
$string = ' bballball';
$string =~ s" (b)\1(a...)\1\2" $1$2";
让我们详细地看看这个例子。该例完成匹配,但是原因不是太明显。对这个字符串的匹配有五个步骤:
1)在圆括号中的第一个b匹配字符串的开头,接着将其存放在\1和$1中。
2)\1于是匹配字符串中的第二个b,因为与b相等,而第二个字符碰巧是b。
3)(a..)匹配字符串all且被存在\2和$2中。
4)\1匹配下一个b。
5)因为\2等于all所以匹配下一个且是最后三个字符(all)。
将他们放到一起就得到正则表达式匹配bballball,或者说是整个字符串。既然$1等于' b',$2等于all,则整个表达式:
$string = ' bballball' ;
$string =~ s" (b)\1(a..)\1\2" $1$2";
(在这个例子中)转换为如下代码:
$string =~ s" (b)b(all)ball" ball";
或者用行话讲,用bballball替换ball。 ’