费了好几个小时,把一小段正则代码搞通了,回顾并记下,加深记忆。
该段代码来自yii.js,它也是引自*,地址是:http://*.com/questions/3446170/escape-string-for-use-in-javascript-regex。
代码如下:
function escapeRegExp(str) {
return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
}
function isReloadableAsset(url) {
for (var i = 0; i < pub.reloadableScripts.length; i++) {
var rule = getAbsoluteUrl(pub.reloadableScripts[i]);
var match = new RegExp("^" + escapeRegExp(rule).split('\\*').join('.*') + "$").test(url);
if (match === true) {
return true;
}
}
return false;
}
重点是第一个函数的返回值,以及第二个函数生成的RegExp实例对象。
str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
这句话的意思是对str中匹配到的字符在其前加\。而被匹配的字符包括-[]\{}()*+?.\^$|,这些符号很明显都是正则表达式中的保留字符,必须进行转义,否则不能正确识别为它本身作为标点符号的意义。
识别后,比如-将被替换为\-,[]将被对应替换为\[\]。
第二个函数中的match,是对经过escapeRegExp方法处理过的url,该url是用户自定义的可以重载的脚本url,此时如果其中有通配符,即*,会被以它为分解进行切割,变成数组,紧接着用 .*进行连接,成字符串。正则表达式中.*是可以匹配所有字符的。