Изменение флагов RegExp

Итак, в основном я написал эту функцию чтобы иметь возможность подсчитать количество появлений подстроки в строке:

String.prototype.numberOf = function(needle) {
  var num = 0,
      lastIndex = 0;
  if(typeof needle === "string" || needle instanceof String) {
    while((lastIndex = this.indexOf(needle, lastIndex) + 1) > 0)
      {num++;} return num;
  } else if(needle instanceof RegExp) {
    // needle.global = true;
    return this.match(needle).length;
  } return 0;
};

Сам метод работает довольно хорошо, и поиск на основе RegExp и String вполне сопоставим по времени выполнения (оба ~ 2 мс на все обширный «451 по Фаренгейту» Рэя Брэдбери ищет все «и».

Что меня беспокоит, - это невозможность изменить флаг предоставленного экземпляра RegExp. Нет смысла вызывать String.prototype.match в этой функции без глобального флага предоставленного регулярного выражения, установленного в значение true, поскольку тогда он будет отмечать только первое возникновение. Вы, конечно, можете установить флаг вручную для каждого RegExp, переданного функции, однако я бы предпочел иметь возможность клонировать, а затем манипулировать установленными флагами регулярного выражения.

Как ни удивительно, мне не разрешено делать это, поскольку Флаг RegExp.prototype.global (точнее, все флаги) доступен только для чтения. Отсюда закомментированная строка 8.

Итак, мой вопрос: Есть ли хороший способ изменить флаги объекта RegExp?

Я действительно не хочу ничего делать нравится:

if(!expression.global)
  expression = eval(expression.toString() + "g");

Некоторые реализации могут не поддерживать RegExp.prototype.toString и просто унаследовать его от Object.prototype , либо это может быть совершенно другое форматирование. И для начала это просто кажется плохой практикой кодирования.

15
задан Witiko 29 April 2011 в 20:14
поделиться