Итак, в основном я написал себе эту функцию, чтобы иметь возможность подсчитать количество встречных событий подстроки в строке:
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 мс на всем огромном Ray Bradbury 451 Fahrenheit), которые ищут все "the" s).
Что меня беспокоит, так это невозможность изменить флаг поставляемого экземпляра RegExp. Нет смысла вызывать String.prototype.match в этой функции, если глобальный флаг поставляемого стандартного выражения не установлен в true, так как тогда он будет отмечать только первый случай. Вы могли бы установить флажок вручную для каждого RegExp, переданного функции, однако я бы предпочел, чтобы он был клонирован, а затем манипулировал указанными флажками регулярного выражения.
Удивительно, но мне не разрешено делать это, поскольку флаг RegExp.prototype.global(точнее, все флаги) выглядят только для чтения. Отсюда вытекающая строка 8.
Итак, мой вопрос: Есть ли хороший способ изменения флагов объекта RegExp?
Я действительно не хочу делать такие вещи:
if(!expression.global)
expression = eval(expression.toString() + "g");
Некоторые реализации могут не поддерживать событие RegExp.prototype.toString и просто наследовать его из Object.prototype, иначе это может быть совсем другое форматирование. И это просто кажется плохой практикой кодирования, чтобы начать с.