作者:手机用户2502872807 | 来源:互联网 | 2023-09-18 17:39
之前大三进修《编译道理》的时刻先生讲了点叫断言的东西,然则这门课压根就没听懂过,所以一向找不到有价值的东西,好吧谅解我懒散蒙昧,理论不合适我,我只合适搬砖。好久以后一些关于正则的黑
之前大三进修《编译道理》的时刻先生讲了点叫断言的东西,然则这门课压根就没听懂过,所以一向找不到有价值的东西,好吧谅解我懒散蒙昧,理论不合适我,我只合适搬砖。好久以后一些关于正则的黑科技才发明正则里也有较断言的东东,好吧得相识相识这是什么。
那末正则里的断言是什么?
援用一段来自百科的申明
用于查找在某些内容(但并不包括这些内容)之前或以后的东西,也就是说它们像b,^,$那样用于指定一个位置,这个位置应当满足一定的前提(即断言),因而它们也被称为零宽断言。(来自百度百科)
断言在一些课本里也称作环顾
。
断言写法
剖析:
前瞻断言(从当前位置向前测试)和后瞻断言(从当前位置向后测试)。
详细的例子看运用方法吧。
注:
括号是必需的,写法:(?!=…)
有些言语并不完整支撑,比方:Javascript的正则并不支撑后瞻断言
表达式,运用了会报错的。
个中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*
即’abc’。
例子:婚配非.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))/
婚配到的位置就是12
与345678
之间的位置,加了g
表全局婚配,
所以继承婚配到满足前提的345
与678
之间的位置,在这些加,
就有了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(",","")
。
后语
上面举的一些例子能够不足以申明题目,假如你是通晓正则的高手望勿喷,固然多多指教那就更好了。