JavaScript正则表达式的模式匹配教程,并且附带充足的实战代码(三)

简介: 我们继续来学习正则表达式吧,没有看过之前文章的小伙伴建议点击上方链接,从第一篇开始看,本系列文章适合从未接触过或不太了解正则表达式的人

指定匹配位置


上一篇我们讲到了分组与引用,本文就从指定匹配位置开始讲。


在正则表达式中,我可以利用某些字符,去指定匹配发生的位置。这些字符我们称之为正则表达式的


字符
含义
^ 匹配字符串的开头
$ 匹配字符串的结尾
\b 匹配一个单词的边界
\B 匹配非单词边界的位置
(?=p) 零宽正向先行断言,?=后面的字符都要与p匹配,但不能包括p的那些字符
(?!p) 零宽负向先行断言,?!后面的字符不与p匹配


我们来逐个说一下这几个字符的用法:


  • ^ 符号


^ 这个符号是将匹配位置定位到字符串的开头,直接来看一个例子


    /*--------------------------第一种情况--------------------*/
    let pattern = /^javascript/let str = "javascript is fun"
    str.match(pattern)         //返回 ['javascript']
    /*--------------------------第二种情况--------------------*/
    let pattern = /^javascript/let str = "i love javascript"
    str.match(pattern)         //返回 null


    我们匹配的模式是,要以javascript开头的字符串。第一种情况,字符串以 javascript开头,所以能匹配到;第二种情况,javascript不是在开头的位置,而是在末尾的位置,不符合匹配模式,所以匹配失败返回null。


    在前面我们有一个地方还用到了 ^ 这个符号,那就是 [^abc] ,所以一定要注意,当 ^ 放在方括号里,表示的是取反,也就是说不匹配方括号里的任何字符。


    • $ 符号


    $ 这个符号是将匹配位置定位到字符串的末尾,直接来看一个例子


      /*--------------------------第一种情况--------------------*/
      let pattern = /javascript$/let str = "javascript is fun"
      str.match(pattern)         //返回 null
      /*--------------------------第二种情况--------------------*/
      let pattern = /javascript$/let str = "i love javascript"
      str.match(pattern)         //返回 ['javascript']


      我们的匹配模式是,字符串要以javascript结尾。第一种情况,字符串结尾处字符是 fun ,不符合匹配模式,返回null;第二种情况,结尾处字符为javascript,符合匹配模式,所以匹配成功。


      我们可以看一下如果 ^ 符号 和 $ 符号一起使用是什么情况:


        let pattern = /^javascript$/let str = "javascript"
        str.match(pattern)      //返回  ["javascript"]


        当这两个符号一起使用时,匹配模式就变成了匹配整段字符串,并且字符串的内容就是 ^ 与 $ 之间的内容


        • \b


        这个符号的作用是匹配一个单词的边界,我们来看几个例子来理解一下


          /*-------------------------第一种情况----------------------*/
          let pattern = /\bjava/let str = "I love javascript"
          str.match(pattern)         //  返回 ['java'] 匹配成功
          /*-------------------------第二种情况----------------------*/
          let pattern = /\bjava/let str = "javascript is fun"
          str.match(pattern)         //  返回 ['java']   匹配成功
          /*-------------------------第三种情况----------------------*/
          let pattern = /\bjava/let str = "1javascript is fun"
          str.match(pattern)         //  返回 null   匹配失败
          /*-------------------------第四种情况----------------------*/
          let pattern = /java\b/let str = "I am learning java"
          str.match(pattern)         //  返回 ['java']   匹配成功
          /*-------------------------第五种情况----------------------*/
          let pattern = /java\b/let str = "I am learning javascript"
          str.match(pattern)         //  返回 null   匹配失败
          /*-------------------------第六种情况----------------------*/
          let pattern = /\bjava\b/let str = "I think java is fun"
          str.match(pattern)         //  返回 ['java']   匹配成功


          看了上面几个例子,你有没有得出什么规律?


          其实 \b 的作用就是将匹配的点放到一个字符串前面(\b放前面)或后面(\b放后面)的 [^a-zA-Z0-9] 处,也可以理解为 \b 可以替换那些特殊字符,但 \b 不会作为匹配的内容。


          • \B


          \B 则与 \b 相反了, \b 可以替换那些特殊字符,那么\B就是用来替换那些非特殊字符,也就是 [a-zA-Z0-9] 内的字符。


          也来举几个简单的例子吧


            /*-------------------------第一种情况----------------------*/
            let pattern = /java\B/let str = "I love javascript"
            str.match(pattern)         //  返回 ['java'] 匹配成功
            /*-------------------------第二种情况----------------------*/
            let pattern = /java\B/let str = "I love java"
            str.match(pattern)         //  返回 null 匹配失败
            /*-------------------------第三种情况----------------------*/
            let pattern = /\Bjava\B/let str = "I love 1javascript"
            str.match(pattern)         //  返回 ['java'] 匹配成功
            /*-------------------------第四种情况----------------------*/
            let pattern = /\Bjava\B/let str = "I love javascript"
            str.match(pattern)         //  返回 null 匹配失败


            • (?=p)


            (?=p)表示接下来的字符要与p匹配,但p不会作为内容返回


            先来看一个例子


              let pattern = /java(script)?(?=\:)/let str = "java: my favorite language"
              str.match(pattern)       //返回 ["java", undefined]  匹配成功


              该例子的匹配模式:匹配一段字符串为java 然后 script 可以有一个也可以没有,后面必须跟一个 :,才能匹配成功,返回匹配内容,但是匹配内容中不包含 :


              再来看一个类似的例子


                let pattern = /java(script)?(?=\:)/let str = "javascript is my favorite language"
                str.match(pattern)       //返回 null  匹配失败


                该例子匹配失败是因为字符串中的javascript后面没有 :,没有满足 (?=\:)的匹配要求


                • (?!p)


                (?!p)与(?=p)相反,它表示接下来的字符不与p匹配


                我们也来看一个例子


                  let pattern = /java(?!script)/let str = "javascript is my favorite language"
                  str.match(pattern)       //返回 null  匹配失败


                  该例子的匹配模式是:匹配一段字符,只要java后面紧跟的字符不是script即为匹配成功,同时java后面跟的内容也不会作为内容返回。但这个例子中的 str 里, java后面紧跟着的就是script,所以匹配失败。那么成功的例子就是这样的


                    let pattern = /java(?!script)/let str = "javascr1111 is my favorite language"
                    str.match(pattern)       //返回 ["java"]  匹配成功


                    在该例子中, java 后面跟着的就不是script了,所以匹配成功了。java后面的字符不作为内容返回,所以最后的匹配结果就是 java


                    结束语


                    第三篇对于 JavaScript正则表达式的讲解就先到这里,明天后天会继续更新第四篇,并且我会在之后的文章上放上前几篇的文章链接,方便大家观看,希望大家持续关注,点个关注,不迷路

                    相关文章
                    |
                    1月前
                    |
                    自然语言处理 JavaScript 前端开发
                    深入理解JavaScript中的闭包:原理与实战
                    【10月更文挑战第12天】深入理解JavaScript中的闭包:原理与实战
                    |
                    2月前
                    |
                    JavaScript
                    Nest.js 实战 (十一):配置热重载 HMR 给服务提提速
                    这篇文章介绍了Nest.js服务在应用程序引导过程中,TypeScript编译对效率的影响,以及如何通过使用webpackHMR来降低应用实例化的时间。文章包含具体教程,指导读者如何在项目中安装依赖包,并在根目录下新增webpack配置文件webpack-hmr.config.js来调整HMR相关的配置。最后,文章总结了如何通过自定义webpack配置来更好地控制HMR行为。
                    |
                    26天前
                    |
                    JavaScript 前端开发 开发者
                    探索JavaScript原型链:深入理解与实战应用
                    【10月更文挑战第21天】探索JavaScript原型链:深入理解与实战应用
                    28 1
                    |
                    1月前
                    |
                    SQL 前端开发 JavaScript
                    Nest.js 实战 (十五):前后端分离项目部署的最佳实践
                    这篇文章介绍了如何使用现代前端框架Vue3和后端Node.js框架Nest.js实现的前后端分离架构的应用,并将其部署到生产环境。文章涵盖了准备阶段,包括云服务器的设置、1Panel面板的安装、数据库的安装、域名的实名认证和备案、SSL证书的申请。在部署Node服务环节,包括了Node.js环境的创建、数据库的配置、用户名和密码的设置、网站信息的填写、静态网站的部署、反向代理的配置以及可能遇到的常见问题。最后,作者总结了部署经验,并希望对读者有所帮助。
                    135 11
                    |
                    1月前
                    |
                    存储 JavaScript 前端开发
                    前端开发:Vue.js入门与实战
                    【10月更文挑战第9天】前端开发:Vue.js入门与实战
                    |
                    18天前
                    |
                    前端开发 JavaScript
                    JavaScript新纪元:ES6+特性深度解析与实战应用
                    【10月更文挑战第29天】本文深入解析ES6+的核心特性,包括箭头函数、模板字符串、解构赋值、Promise、模块化和类等,结合实战应用,展示如何利用这些新特性编写更加高效和优雅的代码。
                    38 0
                    |
                    1月前
                    |
                    数据采集 JSON 前端开发
                    JavaScript逆向爬虫实战分析
                    JavaScript逆向爬虫实战分析
                    |
                    1月前
                    |
                    前端开发 JavaScript API
                    JavaScript逆向爬取实战——使用Python实现列表页内容爬取(二)
                    JavaScript逆向爬取实战——使用Python实现列表页内容爬取(二)
                    |
                    1月前
                    |
                    前端开发 JavaScript API
                    JavaScript逆向爬取实战——使用Python实现列表页内容爬取(一)
                    JavaScript逆向爬取实战——使用Python实现列表页内容爬取(一)
                    |
                    1月前
                    |
                    JavaScript 前端开发
                    电话号码正则表达式 代码 javascript+html,JS正则表达式判断11位手机号码
                    电话号码正则表达式 代码 javascript+html,JS正则表达式判断11位手机号码
                    104 1
                    下一篇
                    无影云桌面