正则表达式之量词

时间:2019-03-15
本文章向大家介绍正则表达式之量词,主要包括正则表达式之量词使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

正则表达式(二)

  量词

  量词的通用形式

  字符组和字符组简记都是只能匹配一个字符,那如果需要匹配一个身份证号呢?那就需要多次重复使用字符组或者字符组简记,量词的存在便是为了解决重复的读写问题。量词的通用形式为{m,n},m,n为数字,限定字符组中字符存在的个数,闭区间,m为下限,n为上限。如\d{3,5}表示匹配字符串的长度最少为3,最大为5。

通用形式 描述
{n} 匹配字符串长度为n
{m,n} 匹配字符串长度最小为m,最大为n
{m,} 匹配字符串长度最小为m,最大为无穷
{0,n} 匹配字符串长度最小为空,最大为n

常用量词

{m,n}为量词通用形式,正则中还存在其他量词,分别为+、*、?。常用于具体元素后,表示出现次数。如:a+表示a会存在且至少出现一次。

常用量词 {m,n}等效形式 描述
+ {1,} 出现次数大于等于1
* {0,} 出现次数大于等于0
{0,1} 出现次数为0或者1

  点号

  点号是一个特殊的元字符,可以匹配任意字符,除了空白字符中的换行符\n。所以点号并不是真正意义上的匹配任意字符,匹配任意字符有两种方法:

  1.在单行匹配模式下,点号可以匹配任意字符。

  2.使用通配字符组[\d\D]、[\w\W]、[\s\S]可以匹配任意字符。

  任意字符是指任意单个字符,所有任意字符则是指多个任意字符。如何匹配所有任意字符呢?可以使用:.*或者[\d\D]*、[\w\W]*、[\s\S]*。

  .*匹配所有任意字符问题

  任意给定字符串"string",使用正则表达式 ".*"进行匹配,匹配流程为:正则“匹配字符串“,之后.*匹配s、t、r、i、n、g,最后字符串尾”是由正则的.*匹配还是由”匹配?

  回答这个问题之前,需要明白量词可以划分为贪婪量词非贪婪量词。之前接触的量词都是贪婪量词,具体表现就是:能匹配的都匹配,每匹配一个就记录当前状态,方便匹配最后出现问题回档。上面问题的实际过程是:.*会匹配字符串尾的”,并且记录匹配状态,匹配完发现字符串结束了,但是正则表达式还剩余一个”没有匹配,这就出了问题了,考虑要照顾正则中”,.*需要查看自己的匹配状态,找到自己匹配的字符串中”,然后回档,让正则”匹配字符串中的”。这种“贪吃出问题又吐出来”的过程称之为回溯

  贪婪量词:能匹配上的都匹配上,出了问题再回溯,回溯过程是把吃了的吐出来。

非贪婪量词:能匹配上的匹配一次就够,剩下字符串让后续正则字符组匹配,出了问题也回溯,回溯过程是把没吃的吃进去。

贪婪量词 非贪婪量词
* *?
+ +?
??
{m,n} {m,n}?
{m,} {m,}?
{0,n} {0,n}?

  非贪婪量词和贪婪量词逐一对应,只是在对应的贪婪量词后加上?,两者表达的意思也是一致,遇到不能匹配的情况都需要回溯。唯一区别在于:贪婪量词面对能匹配的情况优先选择“匹配”,非贪婪量词面对能匹配的情况优先选择“推让”。

   转义

  量词分为贪婪量词、非贪婪量词,又补充了点号,这些特殊含义的字符在匹配原本自身的时候,需要使用\转义。如\*、\{m,n}、\+\?等等。