Javascript 如何从正则表达式中删除全局标志?

Javascript 如何从正则表达式中删除全局标志?,javascript,regex,Javascript,Regex,给定用户(开发人员)提供的正则表达式,我需要删除Firefox 38及更高版本上的全局标志(如果存在): 然而,其他地方不支持这一点。因此,我创建了这对函数: function deGlobal(regex) { if (!regex instanceof RegExp) return regex; if (!regex.global) return regex; var parts = regExpParts(regex); console.log(parts); if (

给定用户(开发人员)提供的正则表达式,我需要删除Firefox 38及更高版本上的全局标志(如果存在):

然而,其他地方不支持这一点。因此,我创建了这对函数:

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
  };
}
这对于我所有的测试用例来说都是非常好的,但它似乎是一种非常容易出错的方法

是否存在这些功能无法工作的情况,或者是否存在更好的跨浏览器方法

提琴:

您可以将其简化为

newregexp(regex.source,regex.flags);
注释在ES6中引入,因此您可能需要:

if(RegExp.prototype.flags==未定义){
Object.defineProperty(RegExp.prototype,'flags'{
对,,
get:function(){
返回此.toString().match(/[gimuy]*$/)[0];
}
});
}
为什么不使用构造函数删除/覆盖标志

例如,当您从以下代码记录
x
时:

let x = /ab(c)/g;
x = new RegExp(x, "");
您应该获得以下输出:

/ab(c)/
您甚至可以覆盖这些标志,如下所示:

let x = /ab(c)/g;
x = new RegExp(x, "mi");
应输出:

/ab(c)/mi

祝你好运。

~4年后,这里解释了如何删除和替换正则表达式。对我来说似乎不错。您可能希望将第二行编辑为另一个变量,或者删除第二行
let
on
x
/ab(c)/mi