鉴于用户(开发人员)提供了正则表达式,我需要删除全局标志(如果存在) . 在Firefox 38及更高版本上你可以设置它1:
the_regex.global = false;
但是其他地方不支持 . 所以,我创建了这对函数:
function deGlobal(regex){
if(!regex instanceof RegExp)return regex;
if(!regex.global)return regex;
var parts = regExpParts(regex);
console.log(parts);
if(parts){
return new RegExp(parts.pattern,parts.flags.replace("g",""));
} else {
return false;
}
}
function regExpParts(regex){
if(!regex instanceof RegExp)return false;
var regex_string = regex.toString();
var flags = regex_string.substring(regex_string.lastIndexOf('/')+1);
var pattern = regex_string.substring(1,regex_string.lastIndexOf('/'));
return {flags:flags,pattern:pattern};
}
fiddle :http://jsfiddle.net/trex005/324k2as5/
对于我的所有测试用例而言,这样做很棒,但它似乎是一种非常容易出错的方法 . 是否存在这些功能不起作用的情况?有没有更好的跨浏览器方法这样做?
1 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/global
1 回答
你简化它
注意RegExp.prototype.flags是在ES6中引入的,因此您可能需要polyfill: