正则表达式Q&A

Posted demystify

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式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>匹配成功。

以上是关于正则表达式Q&A的主要内容,如果未能解决你的问题,请参考以下文章

PHP正则表达式匹配网页里的音标,会的进来帮忙搞定

正则表达式 ? 元字符

正则表达式匹配空间不以 char 开头/结尾

20170822 - Q - 正则表达式 Object 包装类

BigQuery 正则表达式提取两个子字符串之间的字符串

在正则表达式中,我只需要在中间允许空格,并在开头和结尾防止空格