热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

javascript正则断言的明白

之前大三进修《编译道理》的时刻先生讲了点叫断言的东西,然则这门课压根就没听懂过,所以一向找不到有价值的东西,好吧谅解我懒散蒙昧,理论不合适我,我只合适搬砖。好久以后一些关于正则的黑

之前大三进修《编译道理》的时刻先生讲了点叫断言的东西,然则这门课压根就没听懂过,所以一向找不到有价值的东西,好吧谅解我懒散蒙昧,理论不合适我,我只合适搬砖。好久以后一些关于正则的黑科技才发明正则里也有较断言的东东,好吧得相识相识这是什么。

那末正则里的断言是什么?

援用一段来自百科的申明

用于查找在某些内容(但并不包括这些内容)之前或以后的东西,也就是说它们像b,^,$那样用于指定一个位置,这个位置应当满足一定的前提(即断言),因而它们也被称为零宽断言。(来自百度百科)

断言在一些课本里也称作环顾

断言写法

  • 前瞻断言

    • (?=exp) 递次一定环顾,示意所在位置右侧能够婚配exp

    • (?!exp) 递次否认环顾,示意所在位置右侧不能婚配exp

  • 后瞻断言

    • (?<=exp) 逆序一定环顾,示意所在位置左边能够婚配exp

    • (? 逆序否认环顾,示意所在位置左边不能婚配exp

剖析:
前瞻断言(从当前位置向前测试)和后瞻断言(从当前位置向后测试)。

详细的例子看运用方法吧。

注:

  • 括号是必需的,写法:(?!=&#8230;)

  • 有些言语并不完整支撑,比方:Javascript的正则并不支撑后瞻断言表达式,运用了会报错的。

  • 个中exp是一个正则表达式可所以子模式,如:(?=((exp))

  • 环顾也称断言;断言是不占用字符串的((?=exp)所以不能援用,exp是占用字符串的)

运用方法

  • (?=exp) 递次一定环顾,示意所在位置右侧能够婚配exp

来个Javascript的例子,婚配.gif的文件名

var s="img.jpg,abc.gif,123.jpeg";
s.match(/\w*(?=\.gif)/);

结果:["abc"]

/\w*(?=\.gif)/中的\w*示意能够有零个或多个字符,婚配到的是abc,那末(?=.gif)这个婚配到什么?实在他婚配到的只是一个位置,这就是断言的初志,婚配到的是介于abc.gif的位置。
好吧不信来考证下:
去掉正则表达式的\w*,在婚配到的内容替换成#

var s="img.jpg,abc.gif,123.jpeg";
s.replace(/(?=\.gif)/,"#");

结果:"img.jpg,abc#.gif,123.jpeg"

回到定义:(?=exp)递次一定环顾,示意所在位置右侧能够婚配exp;那末/\w*(?=\.gif)/的意义就是以.gif作为右侧的位置才婚配胜利,那就会婚配到abc.gif这里就胜利了,之前说过断言婚配不占用字符宽度(即不结果不会包括断言部份),所以婚配到的字符串就是\w*即&#8217;abc&#8217;。

  • (?!exp) 递次否认环顾,示意所在位置右侧不能婚配exp

例子:婚配非.gif的文件名

var s="img.jpg,abc.gif,123.jpeg";
s.match(/(\w*)(?:\.)(?!gif)\w*/g);

结果:["img.jpg", "123.jpeg"]

/(\w*)(?:\.)(?!gif)\w*/g这个正则示意(\w*)(?:\.)的右侧不是gif婚配胜利。

关于后瞻断言的例子这里不举例子,假如哪位有空填下吧。

运用例子

来看一个来自收集的问答例子:把一串数10000000000字以,分隔成10,000,000,000

这个例子0有点多看着刺眼,先从简朴的最先;好吧我们换一串字符串比方:12345678转换成12,345,678

正则怎样完成呢?
看代码:

var s="12345678";
s.replace(/(?=(\d{3})+(?!\d))/g,",");

是的就这样就能够了。
好吧,来剖析下道理:

/(?=(\d{3})+(?!\d))/g,个中(\d{3})+示意前面的三个数字串最少涌现一组,而后接(?!\d)则示意的是数字的右侧不是数字,
那末就是末端,那/(?=(\d{3})+(?!\d))/婚配到的位置就是12345678之间的位置,加了g表全局婚配,
所以继承婚配到满足前提的345678之间的位置,在这些加,就有了12,345,678了。

假如想看这个例子的历程能够改写下代码:


var s="12345678";
s.replace(/(?=((\d{3})+)(?!\d))/g,function(){console.log(arguments);return ","});

结果:
轮回1: ["", "345678", "678", 2, "12345678"]
轮回2: ["", "678", "678", 5, "12345678"]
返回值:"12,345,678"

好吧,道理不再细说,本身到浏览器控制台实行看结果。

那末这个10000000000转成10,000,000,000就很简朴了。

然则假如数字串的位数是3的倍数会涌如今数字串前面也有一个,号,好吧再正则去掉result.replace(",","")

后语

上面举的一些例子能够不足以申明题目,假如你是通晓正则的高手望勿喷,固然多多指教那就更好了。


推荐阅读
author-avatar
手机用户2502872807
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有