Javascript 是否可以修改现有RegExp上的标志?

Javascript 是否可以修改现有RegExp上的标志?,javascript,regex,Javascript,Regex,我的代码接收一个RegExp对象(我无法控制)。它不是全球性的,但我需要它 目前我正在这样做: if (!regex.global) { var flags = 'g'; if (regex.ignoreCase) flags += 'i'; if (regex.multiline ) flags += 'm'; if (regex.sticky ) flags += 'y'; regex = new RegExp(regex.source, flags); } …因

我的代码接收一个RegExp对象(我无法控制)。它不是全球性的,但我需要它

目前我正在这样做:

if (!regex.global) {
  var flags = 'g';
  if (regex.ignoreCase) flags += 'i';
  if (regex.multiline ) flags += 'm';
  if (regex.sticky    ) flags += 'y';
  regex = new RegExp(regex.source, flags);
}
…因为我想不出别的办法

  • regex.global
    没有setter
  • regex.compile(新模式)
    被弃用,取而代之的是
    newregexp(新模式)
  • regex.flags
    不是什么东西
有更好的办法吗?

恐怕答案是“没有”

无法更改现有正则表达式上的标志。你所做的似乎是最干净的方式

您(可以说)可以稍微缩短可选标志:

var flags = 'g' +
    (regex.ignoreCase ? 'i' : '') +
    (regex.multiline ? 'm' : '') +
    (regex.sticky ? 'y' : '');

即使不能更改现有的
RegExp
的标志,也可以使用修改的标志创建一个新的。一个不错的选择是使用:


可以找到API文档。您将能够使用项目所需的任何其他功能自定义您自己的JS库。

您现在可以在ES6中完成此操作。我所说的“this”并不是指修改现有regexp上的标志,而是指从现有regexp创建一个新的regexp,替换或修改其标志。看见该职位的例子:

function copyWithIgnoreCase(regex) {
  return new RegExp(regex, regex.flags + 'i');
}

例如,考虑到正则表达式的内部结构取决于它是否是全局的(全局正则表达式是一个迭代器),这样的设置器在IMO中代价高昂(它应该做什么?重置状态?)。你的解决方案可能是最好的。我要冒着风险问一下——为什么你需要它成为全球性的?@dystroy:你实际上刚刚救了我一个未来的bug。也就是说,如果regex是全局的,那么我必须记住将regex.lastIndex重置为0。据我所知,非g正则表达式的状态和未实现sticky的位置(大多数情况下仍然如此)不存在->例如:
var r=/a/;var s=“ababa”;r、 行政总裁;r、 行政长官;//r、 lastIndex始终保持在0
@BenjaminGruenbaum:它是“matchAll”的一部分,返回该正则表达式在目标字符串中的所有命中。我可以不用“g”来做,但这意味着我自己要保持状态(例如,在每次匹配后重复分割字符串,因为似乎没有办法告诉正则表达式在每次新的非全局匹配时从何处开始)。
function copyWithIgnoreCase(regex) {
  return new RegExp(regex, regex.flags + 'i');
}