找回密码
 注册
查看: 12010|回复: 1

perl语言正则表达式非捕捉用的括号

[复制链接]
发表于 2011-11-14 20:58:15 | 显示全部楼层 |阅读模式
现在,你已经知道括号可以捕捉匹配上的字符串,并将它们存入变量之中,如果只想用括号将某部分进行分组?考虑这样
的正则表达式:只希望其中一部分括号中所匹配的内容被存入内存变量中。在下面的例子中,我们希望“bronto”是可选择
的,为了将它变成可选择的,我们需要将它用括号括起来。接着,模式使用了一个模式可以得到“steak”或者“burger”,匹
配上的字符串被存入内存变量中。
if(/(bronto)?saurus (steak|burger)/)
{
print “Fred wants a $2\n”;
}
即便“bronto”没有被匹配上,此部分仍然会存入$1。Perl 统计开括号的个数,从而给这些变量命名。我们需要的部分被存入
$2。当模式变复杂时,情况就变得非常复杂。
幸运的是,Perl 的正则表达式有一种方法可以使括号只进行分组,而不会引起内存变量的分配。我们将它叫做非捕捉用的
括号(non-capturing parentheses),对于它,有一个特殊的写法。我们在开括号后面加上一个问号和冒号,(?◆,其作用事
告诉Perl 括号只是分组的作用。
◆这是?号在正则表达式中的第四种用法:问号,表示0 或1 的数量词,非贪婪修饰符,现在是开头符
改变上述正则表达式,使之对“bronto”是非捕捉用的括号,我们需要的部分被存入变量$1。
if(/(?:bronto)?saurus (steak|burger)/)
{
print “Fred wants a $1\n”;
}
如果以后需要改变正则表达式,如在brontosaurs burger 上再加入barbecue,我们可以加入“BBQ ”(含有空格),并且使括号
是非捕捉用的,那么我们需要的部分所对应的内存变量仍为$1。否则,可能每一次在正则表达式中加入括号时,需要改变
内存变量名。
if (/(?:bronto)?saurus (?:BBQ )?(steak|burger)/)
{
print “Fred wants a $1\n”;
}
Perl 的正则表达式的括号还有些其它的特殊用法,它们可以完成某些复杂的功能,如向前找,向后找,内嵌注释,甚至在
模式中执行代码。你可以参阅perlre 的帮助手册了解更详细的信息。
回复

使用道具 举报

发表于 2012-2-26 14:58:21 | 显示全部楼层
谢谢分享了~~
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-21 17:06 , Processed in 0.024202 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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