【发布时间】:2011-08-15 16:21:40
【问题描述】:
所以基本上我自己编写了这个函数,以便能够计算字符串中子字符串的出现次数:
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 和字符串的搜索在执行时间方面都相当可比(在整个庞大的 Ray Bradbury 的“451 Fahrenheit”中搜索所有“the”时都约为 2ms)。
然而,让我感到困扰的是无法更改提供的 RegExp 实例的标志。如果不将提供的正则表达式的全局标志设置为 true,则在此函数中调用 String.prototype.match 是没有意义的,因为它只会记录第一次出现。您当然可以在传递给函数的每个 RegExp 上手动设置标志,但是我更喜欢能够克隆然后操作提供的正则表达式的标志。
令人惊讶的是,我不允许这样做,因为 RegExp.prototype.global 标志(更准确地说是所有标志)似乎是只读的。然后是注释掉的第 8 行。
所以我的问题是:有没有一种不错的方法可以改变 RegExp 对象的标志?
我真的不想做这样的事情:
if(!expression.global)
expression = eval(expression.toString() + "g");
某些实现可能不支持 RegExp.prototype.toString 并且只是从 Object.prototype 继承它,或者它可能是完全不同的格式。这似乎是一种糟糕的编码习惯。
【问题讨论】:
-
我明白了。好吧,我编辑了帖子,所以你可以删除降价。 :-)
-
完成了。对不起!
标签: javascript regex prototype flags