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

Jul*_* TF 11 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);
}
Run Code Online (Sandbox Code Playgroud)

...因为我无法弄清楚任何其他方式.

  • regex.global 没有二传手.
  • regex.compile(new_pattern) 不赞成使用 new RegExp(new_pattern)
  • regex.flags 不是一件事

有一个更好的方法吗?

小智 7

您现在可以在 ES6 中执行此操作。我所说的“这个”并不是指修改现有正则表达式上的标志,而是从现有正则表达式创建一个新的正则表达式来替换或修改其标志。请参阅http://www.2ality.com/2015/07/regexp-es6.html。该帖子中的示例:

function copyWithIgnoreCase(regex) {
  return new RegExp(regex, regex.flags + 'i');
}
Run Code Online (Sandbox Code Playgroud)


Cer*_*rus 2

恐怕答案是否定的。

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

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

var flags = 'g' +
    (regex.ignoreCase ? 'i' : '') +
    (regex.multiline ? 'm' : '') +
    (regex.sticky ? 'y' : '');
Run Code Online (Sandbox Code Playgroud)