一、分组非捕捉用法
我们已经知道括号可以捕捉匹配上的字符串,并将它们存入变量之中,如果只想用括号将某部分进行分组:只希望其中一部分括号中所匹配的内容被存入内存变量中。
在下面的例子中,我们希望“bronto”是可选择的,为了将它变成可选择的,我们需要将它用括号括起来;接着,模式匹配得到“steak”或者“burger”,匹配上的字符串被存入内存变量中。
if(/(bronto)?saurus (steak|burger)/)
{
print "Fred wants a $2\n";
}
即便 “bronto” 没有被匹配上,此部分仍然会存入$1;Perl 统计括号的个数,从而给这些变量命名;我们需要的部分被存入$2;当模式变复杂时,情况就变得非常复杂。
幸运的是,Perl 的正则表达式有一种方法可以使括号只进行分组,而不会引起内存变量的分配。我们将它叫做非捕捉用的括号(non- capturing parentheses),对于它,有一个特殊的写法。我们在括号后面加上一个问号和冒号,(?:),其作用是告诉Perl 括号只是分组的作用。(这部分看了也就差不多了)
改变上述正则表达式,使之对“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";
}
二、预见匹配用法
简单地说,就是匹配时考虑预见匹配的那一部分,不符合的不能算匹配上,但匹配的结果部分(变量$&)要去掉预见匹配部分,又分两种:
1、肯定预见匹配 /pattern(?=string)/,匹配时要考虑符合string
遇见功能,"?=",意识说目标串中肯定存在什么,比如:
var str="ab4";
var reg=/ab(?=\d)/g
alert(reg.test(str)); //结果为true, 意思是第三位肯定是数字;
2、否定预见匹配 /pattern(?!string)/,匹配时要考虑不符合string的才行
结果$&仍然只是取patern部分,不包括string,"?!",意思说目标串中不应该存在什么
var str="ab1";
var reg=/ab(?!\d)/g
alert(reg.test(str)); //结果为false, 意思是目标串中的第三位不应该是数字
本文深入探讨了正则表达式中的高级应用,包括非捕捉分组和预见匹配的使用方法,通过具体示例讲解如何优化模式匹配,提高正则表达式的效率和灵活性。

7046

被折叠的 条评论
为什么被折叠?



