php正则表达式 ? 的三种少见用法

一、分组非捕捉用法

我们已经知道括号可以捕捉匹配上的字符串,并将它们存入变量之中,如果只想用括号将某部分进行分组:只希望其中一部分括号中所匹配的内容被存入内存变量中。
在下面的例子中,我们希望“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, 意思是目标串中的第三位不应该是数字

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

戴国进

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值