找回密码
 注册
查看: 6297|回复: 0

perl语言正则表达式匹配变量

[复制链接]
发表于 2011-11-14 20:42:52 | 显示全部楼层 |阅读模式
我们曾经在模式中使用过括号,使用括号是由于它可以将模式的某一部分组合起来。同时括号也会引起正则表达式分配新
的内存块。这些内存含有括号中的模式所匹配的字符串。如果有不止一对括号,那就不止一块内存块。每一个内存块内有
一段字符串,而非模式的一部分。
由于这些变量含有字符串,那它们是标量变量;在Perl 中,它们具有像$1, $2 这样的名字。变量个数同模式中括号对数的个
数是相同的。如$4 是指第四对括号所匹配的字符串◆。
◆这和后引用(backreference)\4 在模式匹配中引用字符的字符串相同。但它们不仅是同一事物的两个不同名字;\4 是模式正在匹配是引
用的;而$4 是模式匹配完成后再引用的。想了解更多的关于backreferences 的信息,可参见perlre 的帮助手册。
这些匹配变量(match variables)是组成正则表达式强大功能的重要部分,它允许取出相应的字符串:
$_ = “Hello there, neighbor”;
if(/\s(\w+),/){ #空格和逗号之间的词
print “the word was $1\n”; #the word was there
}
也可以一次使用多个:
$_ = “Hello there, neighbor”;
if(/(\S+) (\S+), (\S+)/){
print “words were $1 $2 $3”;
}
其输出为words were Hello there neighbor。注意输出中没有逗号。因为第二块内存中没有逗号。使用这种技术,可以选择
我们感兴趣的部分。
匹配变量可能是空的◆,如果其没有被匹配上。也就是说,匹配变量的值可能为空串:
◆这和undefined 是不同的。如果模式中只有3 个或者更少的括号,那$4 为undef。
my $dino = "I fear that I'll be extinct after 1000 years.";
if ($dino =~ /(\d*) years/) {
print "That said '$1' years.\n"; # 1000
}
my $dino = "I fear that I'll be extinct after a few millions years.";
if ($dino =~ /(\d*) years/) {
print "That said '$1' years.\n"; # 空串
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|小黑屋|生物统计家园 网站价格

GMT+8, 2024-11-21 19:49 , Processed in 0.028621 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表