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

                    相关文章
                    |
                    2月前
                    |
                    自然语言处理 JavaScript 前端开发
                    深入理解JavaScript中的闭包:原理与实战
                    【10月更文挑战第12天】深入理解JavaScript中的闭包:原理与实战
                    |
                    23天前
                    Next.js 实战 (二):搭建 Layouts 基础排版布局
                    本文介绍了作者在Next.js v15.x版本发布后,对一个旧项目的重构过程。文章详细说明了项目开发规范配置、UI组件库选择(最终选择了Ant-Design)、以及使用Ant Design的Layout组件实现中后台布局的方法。文末展示了布局的初步效果,并提供了GitHub仓库链接供读者参考学习。
                    Next.js 实战 (二):搭建 Layouts 基础排版布局
                    |
                    17天前
                    |
                    存储 网络架构
                    Next.js 实战 (四):i18n 国际化的最优方案实践
                    这篇文章介绍了Next.js国际化方案,作者对比了网上常见的方案并提出了自己的需求:不破坏应用程序的目录结构和路由。文章推荐使用next-intl库来实现国际化,并提供了详细的安装步骤和代码示例。作者实现了国际化切换时不改变路由,并把当前语言的key存储到浏览器cookie中,使得刷新浏览器后语言不会失效。最后,文章总结了这种国际化方案的优势,并提供Github仓库链接供读者参考。
                    |
                    1月前
                    |
                    Web App开发 JavaScript 前端开发
                    2024年5月node.js安装(winmac系统)保姆级教程
                    本篇博客为2024年5月版Node.js安装教程,适用于Windows和Mac系统。作者是一名熟悉JavaScript与Vue的大一学生,分享了Node.js的基本介绍、下载链接及简单安装步骤。安装完成后,通过终端命令`node -v`验证版本即可确认安装成功。欢迎关注作者,获取更多技术文章。
                    32 2
                    2024年5月node.js安装(winmac系统)保姆级教程
                    |
                    18天前
                    Next.js 实战 (三):优雅的实现暗黑主题模式
                    这篇文章介绍了在Next.js中实现暗黑模式的具体步骤。首先,需要安装next-themes库。然后,在/components/ThemeProvider/index.tsx文件中新增ThemeProvider组件,并在/app/layout.tsx文件中注入该组件。如果想要加入过渡动画,可以修改代码实现主题切换时的动画效果。最后,需要在需要的位置引入ThemeModeButton组件,实现暗黑模式的切换。
                    |
                    1月前
                    |
                    设计模式 前端开发 JavaScript
                    JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式
                    本文深入探讨了JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式,结合电商网站案例,展示了设计模式如何提升代码的可维护性、扩展性和可读性,强调了其在前端开发中的重要性。
                    32 2
                    |
                    1月前
                    |
                    前端开发 JavaScript UED
                    探索JavaScript的异步编程模式
                    【10月更文挑战第40天】在JavaScript的世界里,异步编程是一道不可或缺的风景线。它允许我们在等待慢速操作(如网络请求)完成时继续执行其他任务,极大地提高了程序的性能和用户体验。本文将深入浅出地探讨Promise、async/await等异步编程技术,通过生动的比喻和实际代码示例,带你领略JavaScript异步编程的魅力所在。
                    30 1
                    |
                    2月前
                    |
                    前端开发 JavaScript UED
                    探索JavaScript中的异步编程模式
                    【10月更文挑战第21天】在数字时代的浪潮中,JavaScript作为一门动态的、解释型的编程语言,以其卓越的灵活性和强大的功能在Web开发领域扮演着举足轻重的角色。本篇文章旨在深入探讨JavaScript中的异步编程模式,揭示其背后的原理和实践方法。通过分析回调函数、Promise对象以及async/await语法糖等关键技术点,我们将一同揭开JavaScript异步编程的神秘面纱,领略其带来的非阻塞I/O操作的魅力。让我们跟随代码的步伐,开启一场关于时间、性能与用户体验的奇妙之旅。
                    |
                    2月前
                    |
                    JavaScript 前端开发 开发者
                    探索JavaScript原型链:深入理解与实战应用
                    【10月更文挑战第21天】探索JavaScript原型链:深入理解与实战应用
                    39 1
                    |
                    2月前
                    |
                    SQL 前端开发 JavaScript
                    Nest.js 实战 (十五):前后端分离项目部署的最佳实践
                    这篇文章介绍了如何使用现代前端框架Vue3和后端Node.js框架Nest.js实现的前后端分离架构的应用,并将其部署到生产环境。文章涵盖了准备阶段,包括云服务器的设置、1Panel面板的安装、数据库的安装、域名的实名认证和备案、SSL证书的申请。在部署Node服务环节,包括了Node.js环境的创建、数据库的配置、用户名和密码的设置、网站信息的填写、静态网站的部署、反向代理的配置以及可能遇到的常见问题。最后,作者总结了部署经验,并希望对读者有所帮助。
                    214 11