当前位置:首页 > 日记 > 正文

正确理解正则表达式回溯在编写高质量js中的作用

正确理解正则表达式回溯在编写高质量js中的作用
当正则表达式扫描目标字符串,我们扫描正则表达式的组件从左到右,我们可以在每一个位置找到匹配。每个量词和分支,它必须决定如何继续。如果它是一个分类器(例如,* +或{ 2 })正则表达式必须被确定的时候,然后尝试匹配多个字符;如果分公司(由|算子),然后正则表达式必须选择尝试这些选项。

当正则表达式做出这样的决定,它会记住另一个选择,如果必要的话,在它返回使用。如果所选的项目匹配成功,正则表达式将继续扫描正则表达式模板,如果剩下的比赛是成功的,比赛将结束。然而,如果选定的方案未能找到相应的匹配或后续比赛失败,正则表达式将追溯到最后的决策点,然后选择剩下的选项。继续这样做,直到你找到一个匹配,或分类器和分支选项,所有可能的组合不放弃尝试失败后的处理,然后移动到下一个字符的开始重复这个过程,重复这个过程。

例如,下面的代码演示了如何通过回溯将这个过程分支。
/ H(i |阿皮)河马 /。试验(你好,快乐的河马);
上面的线正则表达式用于匹配河马或快乐河马。目标字符串的第一个字母是H,并立即找到。下一步,该子表达式(ELLO |阿皮)提供两处理选项。正则表达式选择最左边的选项(分支的选择总是从左到右行),检查ello是否匹配的字符串的下一个字符不匹配,和然后正则表达式匹配下面的空间。

然而,在接下来的比赛中,正则表达式走进死胡同,因为河马H不匹配一个字母T中的字符串,正则表达式不能被抛弃,因为它没有试过所有的选项之前,然后回到上一个检查点(匹配字母h),并尝试匹配二分支选项。但因为匹配不成功,没有更多的选择,正则表达式认为匹配从字符串的第一个字符是不成功的,所以它又开始从第二个字符。正则表达式没有找到,继续找落后,直到第十四封信被发现,这场幸福的H。随后,正规的E一进入分支过程。这一次的再见不匹配。但在第二个分支回溯后,它匹配了整串快乐的河马,比赛成功了。

同样,下面的代码演示了一个重复量词的回溯。
var str =准1。+++准2。+分;
/ / * i.test(STR);
正则表达式匹配的前3个字母的字符串,然后开始。点匹配除了换行字符,星号的贪婪量词重复匹配零次或更多次,尽可能多的时间。因为目标字符串中没有换行符,正则表达式将匹配所有剩下的字符串!但是,由于正则表达式模板的内容需要匹配,正则表达式尝试匹配标签。匹配返回成功需要从第一节到最后一段结束扫描,这可能不是我们想要的结果。

正则表达式中的贪心量词被转化为一个懒惰的(不贪心的)量词来匹配一个段落。*首先尝试跳过所有,然后继续匹配。

这样做是因为*匹配零次或多次,尽可能少地重复,尽可能少地重复0。

如果目标字符串只有一个段落,正则表达式的贪婪版本相当于懒惰版本,但试图匹配的过程是不同的。

当正则表达式以浏览器为几秒甚至更长的时间,这些问题可能是一个回溯失控。为了说明这个问题,下面的正则表达式,以匹配整个HTML文件。这个表达式分成多行来适应页面显示。不像其他的正则表达式,使用点匹配任何字符在选项的情况下,包括换行,所以在这种情况下,匹配任何字符{ }。
{
此正则表达式的作品时,它与一个普通的HTML字符串,但它变得更糟,当目标字符串缺少一个或多个标签,标签丢失,和最后的{ } *将扩展到字符串的末尾,因为没有标签找到,然后正则表达式会看回溯位置上{ 的 }×队列记录,并扩大它们进一步。正则表达式企图扩大二{ } *倒计时--匹配标签,即标签已经匹配正则表达式模板,然后搜索第二标签直到字符串结束。当所有这些步骤失败,第三{ 的 } *互惠将延长至年底的字符串,等等。

该问题的解决方案尽可能具体化字符、窗体(如模板)之间的分隔符。要匹配一个字符串的双引号,更具体的 RN } { ^ * *代替过于宽泛的消除了可能出现的问题,当试图使用回溯法,如点,引号,或扩展搜索范围超出预期。

在HTML的情况下,并不是如此简单。不能用消极的性格类型,如{ ^ < }而不是{ },因为搜索过程中可能遇到的其他类型的标签。然而,它可以通过重复非捕获组达到相同的结果,这包含一个回溯(阻断了所需要的下一个标签)和{ 的 }(任意字符)元素序列。这保证了在中间的每个标签查找失败。然后,更重要的是,该{ 的 }模板挡在回溯过程不能在发现延长。应用这种方法后,正则表达式的最终修改如下:
((())){ })*(()){ })*

((:){ })*(()){ })*

((:){ })*(()){ })*
(()){ { } })。
虽然这种方式消除潜在的回溯失控并允许正则表达式匹配的文本长度的线性时不完整的HTML字符串失败,正则表达式的效率并没有提高。这样,每一个匹配的字符是看了许多次,缺乏效率和匹配成功的过程是相当缓慢的。使用这种方法时匹配一个短的字符串,这是非常好的,和匹配一个HTML文件可能需要向前看,次测试数千。

相关文章

微软新政:允许用户每90天执行Office

微软新政:允许用户每90天执行Office

用户,执行,新政,许可证,电脑软件,目前,有很多Office PC 2013用户抱怨微软,因为最终用户的软件许可协议将完全锁定到计算机的软件,如果安装Office 2013 PC用户设备故障或需要更换设备,因此他们不得不花额外的钱购买Office 2013软件。 现在,微软已…

excel中多行多列数据排序的操作技

excel中多行多列数据排序的操作技

操作,多列,数据排序,技术,电脑软件,Excel可以多行和多栏数据。如何操作的今天,小编辑教你操作技术分类多排多列数据在Excel。 excel在多行、多列数据排序中的操作步骤 小编译中表的一个例子是演示操作过程。 将数据从A到F列从表的1到5行…

一个关于QQ语音如何转发和转发QQ语

一个关于QQ语音如何转发和转发QQ语

语音,转发,教程,电脑软件,QQ,如果你想把QQ聊天记录转发给别人看看,方法很简单,直接截图。那么,如何把QQ语音的内容信息转发给别人呢接下来,萧边给你一个教程就如何推进QQ语音,和手机版和电脑端QQ语音转发的教程。 QQ语音转发课程方法 1,首先,我…

Chrome需要运行权限

Chrome需要运行权限

权限,运行,电脑软件,Chrome,问:当使用Chrome浏览器打开淘宝购物网站,它总是出现在地址栏的底部:阿里旺旺插件在Firefox和Netscape需要您的许可才能运行。即使点击运行或;;运行所有的时间在网站上;它仍然会提示下一次。这应该怎么解决 答:右键点击…

提示如果您想在Windows资源管理器

提示如果您想在Windows资源管理器

资源管理,站点,提示,您想,器中,问题: 电脑重装系统后,您无法登录到FTP FTP服务器: / / 192.168.0.1。它提示。如果你想查看在Windows资源管理器中,单击FTP站点,页面,然后点击'打开',FTP站点,在Windows资源管理器。 答案uff1a 我的电脑是使用IE8…

正则表达式确定实现代码以保留2位

正则表达式确定实现代码以保留2位

正则表达式,小数,代码,电脑软件,废话没多说,直接给大家粘上代码,具体代码如下所示: 六点八八八八八八八八 Html(); 指针函数(){ var; VaR的新; var = /({ } + 0-9 0-9。{ } { 2 }){ 0-9 } * /; 新= a.replace(RE,1美元); $()。Html(重新) } 以上是萧边向你介…

Oracle实现授权用户truncatetable

Oracle实现授权用户truncatetable

授权,用户,电脑软件,Oracle,truncatetable,1、在其他用户的表执行trundate表操作 发展说,当被dwetl商店用户表下,没有权限操作。谷歌检查并发现Oracle帐户不能直接授予表的截断权限。怎么发生的 在商店用户下,准备测试数据 >创建表的SQL z_t…

PS图象处理软件生产的彩色生锈的金

PS图象处理软件生产的彩色生锈的金

图象,处理软件,彩色,金属网,电脑软件,最终效果 1。首先,我们需要定义一个点样式。一种新的100x100像素的文件,设置分辨率为300像素/英寸,背景填充为黑色,椭圆选择工具,设置为一个固定尺寸的高度和宽度为24像素,在画布中点击任何地方,然后点击选择…

一个简单而动人的画面:一辆PS图象处

一个简单而动人的画面:一辆PS图象处

一辆,图象,处理软件,动人,画面,平时,我们经常可以在网上看到很多动态的照片,特别是汽车和其他时尚的运动项目,非常漂亮,它们都是怎么做的呢其实,在PS中可以很简单的实现它们。然后以照片的一张照片为例,教你如何制作一幅动态图片,希望能帮到需要的…

的mysql5.7.18减压版启动mysql服务

的mysql5.7.18减压版启动mysql服务

服务,启动,电脑软件,mysql,的mysql5.7.18减压版启动MySQL服务,详情如下 1。下载mysql社区版 2。解压到D:程序文件 三.在D:程序文件 mysql-5.7.18-winx64 仓,新文件my.ini,内容如下: {客户} 港口= 3306 默认字符集= utf8 {他} 绑定地址= 127.0…

PS老鼠画可爱的沙砾一盆花

PS老鼠画可爱的沙砾一盆花

沙砾,盆花,老鼠,可爱,电脑软件,本教程教学习者使用PS PS鼠标画花图案,画家画沙砾,课程难度一般,比较适合初学者学习,漂流!让我们看看我们的效果。 上面是可爱的砂砾样式PS鼠标画了一盆花,很简单啊,你学了吗你喜欢的朋友可以试着做一个! 相关阅读: P…

支付宝升级后不能使用手势密码没有

支付宝升级后不能使用手势密码没有

手势密码,升级,支付宝,电脑软件,问题: 现在超市购物经常使用支付宝付款,总是使用手势密码,非常方便。但在v8.6.3升级,发现符号代码没有用,这是取消了吗怎么了 答案uff1a 我还发现了这个问题,Alipay客户端升级到最新版本,支持触摸ID iOS设备,不管…