js 正则学习小记之匹配字符串字面量优化篇
Js正则学习笔记:优化字符串字面量的匹配表达式
昨天在《js 正则学习小记之匹配字符串字面量》中,我们遇到的表达式 /"(?:\\.|[^"])"/,虽然能满足某些要求,但从性能角度看,它并非最佳选择。
这个表达式的运作原理是,当遇到分支时,传统型NFA引擎会从左至右进行匹配。它会尝试用 \\. 匹配每一个字符,若不匹配,则会用 [^"] 尝试。以字符串 "123456\'78\"90" 为例,除了第一个双引号 " 直接匹配成功,剩余字符中仅有两次转义(四个字符),\\. 会失败十次。这意味着需要十次回溯,再用 [^"] 进行匹配。显然,随着字符串长度的增长,这种方法的效率会越来越低。
为了优化性能,我们考虑调整正则表达式的结构。简单的交换位置并不奏效,如 /"(?:[^"]|\\.)"/。这样虽然提高了转义字符的匹配效率,但会导致正常的转义情况无法被匹配。
进一步修改,得到 /"(?:[^"\\]|\\.)"/,它能够正确处理 \ 的转义情况。由于 . 在正则表达式中无法匹配换行,且我们在 [^"\\] 中过滤了 ,该表达式无法处理多行字符串。在js中,字符串折行是允许的,因此我们需要进一步改进这个正则表达式。
为了处理换行符,我们可以引入 \d、\D 等概念。使用 /"(?:[^"\\]|\\[\d\D])"/,我们可以匹配所有字符,包括换行符。这个表达式的运作方式是,首先尝试匹配除转义字符和引号外的任何字符,若失败,则回溯并尝试匹配转义字符序列。
以字符串 "123456\'78\"90" 为例,这个新的正则表达式只需两次回溯,较之前的十次大大提升了效率。
今天的分享到此结束。明天的再见,期待与您的继续交流。
注:以上内容纯属学术与知识分享,如有误解或需要进一步优化的地方,欢迎指正与交流。
(注:文章最后的一行“cambrian.render('body')”似乎与主题无关,已为您删除。)
编程语言
- js 正则学习小记之匹配字符串字面量优化篇
- ajax 怎么设置超时(一个action执行了2遍)
- 一条SQL语句修改多表多字段的信息的具体实现
- bootstrap table 服务器端分页例子分享
- JavaScript统计字符串中每个字符出现次数完整实例
- PHP简单实现DES加密解密的方法
- checkbox-click事件触发span元素内容改变的方法
- JavaScript中getUTCMinutes()方法的使用详解
- 解决node.js安装包失败的几种方法
- asp.net 未能写入输出文件--“拒绝访问的解决办法
- asp.net程序优化 尽量减少数据库连接操作
- 用JS编写一个函数,返回数组中重复出现过的元素
- 微信公众号支付之坑:调用支付jsapi缺少参数 t
- asp.net利用母版制作页脚效果
- JavaScript实现时间表动态效果
- Angularjs为ng-click事件传递参数