JavaScript正则表达式匹配字符串字面量
首次遭遇代码高亮问题,大约是在两年前的一个深夜,当时我尚未掌握那些复杂的正则表达式技巧。如今,从最初的解决方案已经历三代演变,让我们回首这些变迁,感叹技术的不断进步。
第一代解决方案,那时的我还在正则表达式的海洋中摸索,未能娴熟运用如(?:...)等高级特性。解决思路以寻找结束引号为入口,然而这一方法逻辑混乱,存在不少错误。比如面对字面量 "abc\\\"",它会误匹配为 "abc\\",而正确的结果应该是识别转义字符后的完整字符串 "abc\\\""。那时的正则表达式如下:
var re = /('('|.?([^\\]'|\\\\'))|"("|.?([^\\]"|\\\\")))/g;
第二代方案,我们对原有的思路进行了修正,依然以寻找结束引号为基础,但添加了针对特殊字符\的处理,解决了第一代的bug。正则表达式的改进如下:
var re = /(['"])(?:.?[^\\](?:\\\\))?\1/g;
而第三代方案,则是在昨夜灵感突发(之后还进行了一些微调),实现了多行字符串字面量的支持。思路发生了重大转变,从匹配结束引号转变为匹配中间内容。这里运用了一个正则表达式中的常用技巧,我称之为“抢占”。在诸如/a|./的正则表达式中,越靠前的部分越先匹配。通过“抢占”一些特定字符,可以避免很多不必要的麻烦。
在这个例子中,/\\[\s\S]/就能很自然地“抢占”到像 \” 这样的转义字符,从而避免了转义字符中的 ” 对匹配造成影响。这是局部的“抢占”,在更大的范围内,比如在注释中的字符串或字符串中的注释,只要在同一正则表达式中涵盖相关匹配,那么先遇到的将会优先匹配。例如 /(注释正则)|(字符串正则)/g,这种方式可以先将内容匹配出来,再作进一步的处理和判断。
虽然可能对于多数人来说,这些技术的使用场景有限,但在某些特定情况下,它们能发挥出巨大的作用。愿这些技术能为你们带来便利和惊喜~ cambrian.render('body')这句代码似乎是用于渲染页面的命令,愿它在你的项目中顺利运行,展现出美好的界面。
编程语言
- JavaScript正则表达式匹配字符串字面量
- node.js cookie-parser之parser.js
- jQuery弹出层后禁用底部滚动条(移动端关闭回到原
- Ajax 和 Asp 的编程
- 如何用表单的方式推送请求的信息?
- JavaScript之map reduce_动力节点Java学院整理
- windows下傻瓜式安装mysql5.7
- php生成zip文件类实例
- PHP goto语句简介和使用实例
- 原生javascript实现的一个简单动画效果
- 使用window.prompt()实现弹出用户输入的对话框
- 两级联动select刷新后其值保持不变的实现方法
- Nodejs异步回调之异常处理实例分析
- git 将本地文件(夹)上传到gitee指定分支的处理方法
- 详解vue2.0的Element UI的表格table列时间戳格式化
- Bootstrap基本样式学习笔记之标签(5)