zoukankan      html  css  js  c++  java
  • 如何理解正则表达式匹配过程

    本文通过实例,为你介绍正则表达式匹配过程,通过对匹配过程的理解,将有助于你更加深入理解正则表达式匹配逻辑。

    正则: console.log(('12345').match(/d*/g)); 
    匹配结果: ["12345", ""] 
    匹配过程如下:

     
    1. 第一次匹配:
    2. d*,因为没有位置限定,因此是从文本开始位置开始,也就是^
    3. 这个^是虚拟字符,也就是12345里的1前面的位置
    4. d*,贪婪匹配,0-n个,尽可能多匹配,因此,12345都匹配了
    5. 此时,正则匹配的位置到了5后面,完成第一次匹配。
    6. 第二次匹配:
    7. 但是,因为g模式,做的是全局匹配,因此,d*从5后面位置开始,继续匹配,直到文本结束位置,也就是$
    8. 这个$也是虚拟字符,匹配文本的结束位置
    9. d*,因为是0-n个,此时,利用的0个匹配,因此得到"",完成第二次匹配。
    10. 上面,主要利用的知识点有:
    11. 1. 开始(^)和结束位置($
    12. 2. 贪婪模式
    13. 3. * 的含义
    14. 4. 正则匹配的位置移动原理(正则引擎匹配原理)

    正则: console.log(('12345').match(/1*/g)); 
    匹配结果: ["1", "", "", "", "", ""] 
    匹配过程如下:

     
    1. 1* 首先从123451前面位置开始,贪婪模式,尽可能多匹配1,因此,匹配完后,正则的匹配开始位置到了2前面位置
    2. 1* 2前面位置开始,单字符匹配,因为1没法匹配2,因此,用了*的特性,匹配0个,正则的匹配开始位置到了3前面位置
    3. 1* 3前面位置开始,单字符匹配,因为1没法匹配3,因此,用了*的特性,匹配0个,正则的匹配开始位置到了4前面位置
    4. 1* 4前面位置开始,单字符匹配,因为1没法匹配4,因此,用了*的特性,匹配0个,正则的匹配开始位置到了5前面位置
    5. 1* 5前面位置开始,单字符匹配,因为1没法匹配5,因此,用了*的特性,匹配0个,正则的匹配开始位置到了5后面位置
    6. 1* 5后面位置,单字符匹配,匹配文本结束位置,没有匹配1,用了*的特性,匹配0个,正则的匹配完成

    更多示例,读者可尝试推演一下:

     
    1. console.log(('12345').match(/12345??/g)); //1234
    2. console.log(('12345').match(/12345?/g)); //12345
    3. 注:?? 等价于 {0,1}? 非贪婪模式,不匹配优先
    4. ? 等价于 {0,1} 贪婪模式,匹配优先

    关于匹配次数???的讲解可以参考《正则表达式匹配次数

  • 相关阅读:
    angular面试记忆的内容
    doctype
    161214、oracle查询表信息
    161213、Maven资源替换和Freemarker模板
    161212、并发编程中的关于队列
    161209、简要分析ZooKeeper基本原理及安装部署
    161208、Java enum 枚举还可以这么用
    161207、高并发:java.util.concurrent.Semaphore实现字符串池及其常用方法介绍
    161206、 Ionic、Angularjs、Cordova搭建Android开发环境
    161205、win10安装mysql5.7.16数据库
  • 原文地址:https://www.cnblogs.com/tsql/p/6386204.html
Copyright © 2011-2022 走看看