正则表达式Q&A

正则表达式-思维导图:

http://naotu.baidu.com/file/2a60a5628a9b526a512e2fcc86986861

1、针对NFA引擎,用[0-9]+来匹配a 1234 num , 最终的匹配结果是什么?引擎会保存几个备选状态?如果用[0-9]*来匹配a 1234 num,最终的匹配结果是什么?有几个备选状态?会不会在1处保存备选状态?

      +号要求匹配一次或多次,因此引擎会在查询到1、2、3、4时分别保存一个备选状态,匹配n时失败,返回到最近的备用状态4的位置,所以匹配结果时1234,保存有四个备选状态;

      *号要求匹配零次或多次,因此引擎会在a的位置报告匹配成功,引擎停止,最终的匹配结果是a, 因为没有继续往后前进,所以没有备选状态。

2、针对NFA引擎,用 ^.*([0-9][0-9]) 匹配 CA 95472 USA 的结果是什么?过程是怎样的?

     .*成功匹配到字符串的结尾,同时保存许多备用状态,这时尝试匹配[0-9],显然结尾字符A不满足匹配,所以会从选择最近的备选状态来进行尝试,匹配字符S, 依次回溯执行上述过程直到遇到字符2,第一个[0-9]匹配成功,引擎开始在此位置尝试匹配第二个[0-9],匹配失败,继续回溯到7之前,这时两个[0-9]都能匹配,停止回溯,返回匹配成功的结果:CA 95572, $1得到的是72。

3、针对NFA引擎,用忽略优先的正则<B>.*?</B>来匹配 <B>Billions</B> and <B>Zillions</B> of suns的过程是怎样的?

     开始匹配到<B>之后,.*?首先决定不需要匹配任何字符,将控制权交给表达式中后面的<,从字符串中匹配<失败,所以控制权又回到.*?, 这时先用.号匹配<B>之后的B, 此时*?又必须选择,是继续尝试匹配,还是忽略?因为是忽略优先的,所以会首先选择忽略,控制权交给之后的<, <仍然无法在字符串中匹配,控制权继续回到.*?, .号再匹配一个字符后继续选择忽略,重复上述过程,知道</B>匹配成功。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值