javascript中正则表达式分组、断言的示例分析-创新互联

这篇文章主要为大家展示了“javascript中正则表达式分组、断言的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“javascript中正则表达式分组、断言的示例分析”这篇文章吧。

十余年的鸡冠网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。营销型网站的优势是能够根据用户设备显示端的尺寸不同,自动调整鸡冠建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联建站从事“鸡冠网站设计”,“鸡冠网站推广”以来,每个客户项目都认真落实执行。

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

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

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

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

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

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

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

      .*

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

      <(title)>.*

      这个例子实际上就是反向引用的实际应用。对于分组而言,整个表达式永远算作第0组,在本例中,第0组是<(title)>.*,然后从左到右,依次为分组编号,因此,(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,它没有规律,但是它前边肯定会有,后边肯定会有,这就足够了。

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

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

      这样就能匹配到xxx。

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

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

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

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

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

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

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

(?=X )

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

(?!X)

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

(?<=X)

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

(?

零宽度负后发断言。仅当子表达式 X 不在此位置的左侧匹配时才继续匹配。例如,(?

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

以上是“javascript中正则表达式分组、断言的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注创新互联网站建设公司行业资讯频道!

另外有需要云服务器可以了解下创新互联建站www.cdcxhl.com,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


名称栏目:javascript中正则表达式分组、断言的示例分析-创新互联
转载源于:http://pwwzsj.com/article/dsjgsd.html