Chinaunix首页 | 论坛 | 博客
  • 博客访问: 858753
  • 博文数量: 253
  • 博客积分: 6891
  • 博客等级: 准将
  • 技术积分: 2502
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-03 11:01
文章分类

全部博文(253)

文章存档

2016年(4)

2013年(3)

2012年(32)

2011年(184)

2010年(30)

分类: 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。 ’

阅读(2776) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~