字符组和字符组简记都是只能匹配一个字符,那如果需要匹配一个身份证号呢?那就需要多次重复使用字符组或者字符组简记,量词的存在便是为了解决重复的读写问题。量词的通用形式为{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}、\+\?等等。
原文:https://www.cnblogs.com/snow-lanuage/p/10529431.html