javascript 正则表达式分组、断言详解

发布时间 - 2026-01-11 00:45:03    点击率:

 javascript 正则表达式分组、断言详解

  提示:阅读本文需要有一定的正则表达式基础。

       正则表达式中的断言,作为高级应用出现,倒不是因为它有多难,而是概念比较抽象,不容易理解而已,今天就让小菜通俗的讲解一下。

       如果不用断言,以往用过的那些表达式,仅仅能获取到有规律的字符串,而不能获取无规律的字符串。

       举个例子,比如html源码中有<title>xxx</title>标签,用以前的知识,我们只能确定源码中的<title>和</title>是固定不变的。因此,如果想获取页面标题(xxx),充其量只能写一个类似于这样的表达式:<title>.*</title>,而这样写匹配出来的是完整的<title>xxx</title>标签,并不是单纯的页面标题xxx。

       想解决以上问题,就要用到断言知识。

       在讲断言之前,读者应该先了解分组,这有助于理解断言。

       分组在正则中用()表示,根据小菜理解,分组的作用有两个:

       n  将某些规律看成是一组,然后进行组级别的重复,可以得到意想不到的效果。

       n  分组之后,可以通过后向引用简化表达式。

        先来看第一个作用,对于IP地址的匹配,简单的可以写为如下形式:

       \d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}

       但仔细观察,我们可以发现一定的规律,可以把.\d{1,3}看成一个整体,也就是把他们看成一组,再把这个组重复3次即可。表达式如下:

       \d{1,3}(.\d{1,3}){3}

       这样一看,就比较简洁了。

再来看第二个作用,就拿匹配<title>xxx</title>标签来说,简单的正则可以这样写:

       <title>.*</title>

       可以看出,上边表达式中有两个title,完全一样,其实可以通过分组简写。表达式如下:

       <(title)>.*</\1>

       这个例子实际上就是反向引用的实际应用。对于分组而言,整个表达式永远算作第0组,在本例中,第0组是<(title)>.*</\1>,然后从左到右,依次为分组编号,因此,(title)是第1组。

       用\1这种语法,可以引用某组的文本内容,\1当然就是引用第1组的文本内容了,这样一来,就可以简化正则表达式,只写一次title,把它放在组里,然后在后边引用即可。

       以此为启发,我们可不可以简化刚刚的IP地址正则表达式呢?原来的表达式为\d{1,3}(.\d{1,3}){3},里边的\d{1,3}重复了两次,如果利用后向引用简化,表达式如下:

       (\d{1,3})(.\1){3}

       简单的解释下,把\d{1,3}放在一组里,表示为(\d{1,3}),它是第1组,(.\1)是第2组,在第2组里通过\1语法,后向引用了第1组的文本内容。

       经过实际测试,会发现这样写是错误的,为什么呢?

       小菜一直在强调,后向引用,引用的仅仅是文本内容,而不是正则表达式!

       也就是说,组中的内容一旦匹配成功,后向引用,引用的就是匹配成功后的内容,引用的是结果,而不是表达式。

       因此,(\d{1,3})(.\1){3}这个表达式实际上匹配的是四个数都相同的IP地址,比如:123.123.123.123。

       至此,读者已经掌握了传说中的后向引用,就这么简单。

       接下来说说什么是断言。

       所谓断言,就是指明某个字符串前边或者后边,将会出现满足某种规律的字符串。

       就拿文章开篇的例子来说,我们想要的是xxx,它没有规律,但是它前边肯定会有<title>,后边肯定会有</title>,这就足够了。

       想指定xxx前肯定会出现<title>,就用正后发断言,表达式:(?<=<title>).*

       向指定xxx后边肯定会出现</title>,就用正先行断言,表达式:.*(?=</title>)

       两个加在一起,就是(?<=<title>).*(?=</title>)

       这样就能匹配到xxx。

     

       相信读者看到这,已经蒙了,不用急,待小菜慢慢讲来。

     

       其实掌握了规律,就很简单了,无论是先行还是后发,都是相对于xxx而言的,也就是相对于目标字符串而言。

       假如目标字符串后边有条件,可以理解为目标字符串在前,就用先行断言,放在目标字符串之后。

       假如目标字符串前边有条件,可以理解为目标字符串在后,就用后发断言,放在目标字符串之前。

       假如指定满足某个条件,就是正。

       假如指定不满足某个条件,就是负。

       断言只是条件,帮你找到真正需要的字符串,本身并不会匹配!

(?=X )

零宽度正先行断言。仅当子表达式 X 在 此位置的右侧匹配时才继续匹配。例如,/w+(?=/d) 与后跟数字的单词匹配,而不与该数字匹配。此构造不会回溯。

(?!X)

零宽度负先行断言。仅当子表达式 X 不在 此位置的右侧匹配时才继续匹配。例如,例如,/w+(?!/d) 与后不跟数字的单词匹配,而不与该数字匹配 。

(?<=X)

零宽度正后发断言。仅当子表达式 X 在 此位置的左侧匹配时才继续匹配。例如,(?<=19)99 与跟在 19 后面的 99 的实例匹配。此构造不会回溯。

(?<!X)

零宽度负后发断言。仅当子表达式 X 不在此位置的左侧匹配时才继续匹配。例如,(?<!19)99 与不跟在 19 后面的 99 的实例匹配

       从断言的表达形式可以看出,它用的就是分组符号,只不过开头都加了一个问号,这个问号就是在说这是一个非捕获组,这个组没有编号,不能用来后向引用,只能当做断言。

       教程到此结束,希望大家阅读愉快!


# javascript  # 正则表达式分组、断言详解  # js  # 正则表达式  # 断言  # 详解JavaScript中jQuery和Ajax以及JSONP的联合使用  # JavaScript断言与类型守卫及联合声明超详细介绍  # 的是  # 后向  # 就用  # 放在  # 时才  # 会有  # 中有  # 而不  # 可以通过  # 组里  # 可以看出  # 相对于  # 跟在  # 就拿  # 与该  # 都是  # 而不是  # 第一个  # 就能 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel定时任务怎么设置_Laravel Crontab调度器配置  Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】  jQuery validate插件功能与用法详解  网站页面设计需要考虑到这些问题  零服务器AI建站解决方案:快速部署与云端平台低成本实践  如何用好域名打造高点击率的自主建站?  如何实现javascript表单验证_正则表达式有哪些实用技巧  Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程  Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】  Python高阶函数应用_函数作为参数说明【指导】  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭  如何基于云服务器快速搭建个人网站?  如何快速选择适合个人网站的云服务器配置?  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  Python结构化数据采集_字段抽取解析【教程】  网易LOFTER官网链接 老福特网页版登录地址  如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)  如何确保西部建站助手FTP传输的安全性?  Laravel怎么调用外部API_Laravel Http Client客户端使用  Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】  怎样使用JSON进行数据交换_它有什么限制  Laravel怎么实现支付功能_Laravel集成支付宝微信支付  如何在Tomcat中配置并部署网站项目?  济南网站建设制作公司,室内设计网站一般都有哪些功能?  如何在IIS中配置站点IP、端口及主机头?  b2c电商网站制作流程,b2c水平综合的电商平台?  Laravel如何使用.env文件管理环境变量?(最佳实践)  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  Laravel怎么生成URL_Laravel路由命名与URL生成函数详解  消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工  Laravel怎么上传文件_Laravel图片上传及存储配置  Laravel如何生成URL和重定向?(路由助手函数)  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】  简单实现Android验证码  详解jQuery中的事件  太平洋网站制作公司,网络用语太平洋是什么意思?  Laravel怎么在Blade中安全地输出原始HTML内容  如何用腾讯建站主机快速创建免费网站?  韩国服务器如何优化跨境访问实现高效连接?  Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程  Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】  uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址  Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门  Laravel如何实现多对多模型关联?(Eloquent教程)  魔毅自助建站系统:模板定制与SEO优化一键生成指南  Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率