• 正则表达式之量词


    正则表达式(二)

      量词

      量词的通用形式

      字符组和字符组简记都是只能匹配一个字符,那如果需要匹配一个身份证号呢?那就需要多次重复使用字符组或者字符组简记,量词的存在便是为了解决重复的读写问题。量词的通用形式为{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

      点号

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

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

      2.使用通配字符组[dD]、[wW]、[sS]可以匹配任意字符。

      任意字符是指任意单个字符,所有任意字符则是指多个任意字符。如何匹配所有任意字符呢?可以使用:.*或者[dD]*、[wW]*、[sS]*。

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

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

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

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

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

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

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

       转义

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

  • 相关阅读:
    Rman-10038: Database Session For Channel D1 Terminated Unexpectedly
    MySQL从入门到项目实践 pdf下载
    Oracle_优化器使用(oracle11g)
    当sqlserver启用sa账户时,出现Microsoft SQL Server 错误代号: 15535 解决方法 (转)
    sqlserver 如何分析“死锁调度程序”转储?
    AtCoder Beginner Contest 213
    LOJ
    [学习笔记] 计算几何
    [COCI 2009-2010 #6] XOR
    BZOJ
  • 原文地址:https://www.cnblogs.com/snow-lanuage/p/10529431.html
Copyright © 2020-2023  润新知