首页 文章

从RegExp中删除全局标志

提问于
浏览
0

鉴于用户(开发人员)提供了正则表达式,我需要删除全局标志(如果存在) . 在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};
}

fiddlehttp://jsfiddle.net/trex005/324k2as5/

对于我的所有测试用例而言,这样做很棒,但它似乎是一种非常容易出错的方法 . 是否存在这些功能不起作用的情况?有没有更好的跨浏览器方法这样做?

1 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/global

1 回答

  • 1

    你简化它

    new RegExp(regex.source, regex.flags);
    

    注意RegExp.prototype.flags是在ES6中引入的,因此您可能需要polyfill

    if (RegExp.prototype.flags === undefined) {
      Object.defineProperty(RegExp.prototype, 'flags', {
        configurable: true,
        get: function() {
          return this.toString().match(/[gimuy]*$/)[0];
        }
      });
    }
    

相关问题