JavaScript正则表达式匹配字符串字面量
第一次遇到这个问题,是大概两年前写代码高亮,从当时的解决方案到现在一共有三代,嘎嘎.觉得还是算越来越好的.
第一代:
//那个时候自己正则还不算很精通,也没有(?:...)这种习惯,是以寻找结束引号为入口写出的这个正则.思路混乱,也存在错误. //比如像字面量"abc\\\"",则会匹配为"abc\\\",而正确的结果应该是"abc\\\"". varre=/('('|.*?([^\\]'|\\\\'))|"("|.*?([^\\]"|\\\\")))/g;
第二代:
//这个匹配其实和第一代思路基本相同,也是寻找结束引号,通过给\\添加*解决了第一代的bug. varre=/(['"])(?:.*?[^\\](?:\\\\)*)?\1/g;
第三代:
//老实说第三代是昨天晚上出题的时候突然想出来的(后来又修改过),支持多行字符串字面量,思路也有了较大的转变,从匹配结束引号变味了匹配中间内容. varre=/(['"])(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*?\1/g
这里有一个正则里非常常用的技巧,姑且称之为“抢占”,在诸如/a|./这样的正则里,越靠前越先匹配,通过“抢占”一些字符,可以避开很多麻烦.说起来有些抽象,在上面这个例子里,/\\[\s\S]/就可以很自然地抢到\”这样的转义字符,所以不必担心转义字符中的”给匹配造成影响.这是局部的“抢占”,还有更大范围的,比如注释里的字符串或者字符串里的注释,只要在同一个正则中,把相关匹配都写入,则一定是先遇到的优先.如/(注释正则)|(字符串正则)/g,可以先通过这样的方式,把内容匹配出来,再进行进一步判断处理.
虽然可能对于多数人来说,用处不大,但万一呢?Bestwishes~