所以基本上我写我自己这个功能,从而能算子串出现的次数在一个字符串:改变正则表达式标志
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;
};
方法本身执行得相当好两者的正则表达式和基于字符串的搜索与执行时间非常相似(在整个巨大的雷布拉德伯里的“451华氏度”搜索所有“这些”都是〜2ms。
但是,困扰我的是,不可能改变提供的RegExp实例的标志。在此函数中调用String.prototype.match是没有意义的,因为它只会记录第一次出现的情况,而不会将提供的正则表达式的全局标志设置为true。你当然可以在每个传递给函数的RegExp上手动设置标志,但是我希望能够克隆并操作提供的正则表达式标志。
令人惊讶的是,我不允许这样做,因为RegExp.prototype.global标志(更确切地说所有标志)看起来都是只读的。从那里注释掉的线8.
所以我的问题是:有没有不错改变RegExp对象的标志的方式?
我真的不想要做这样的东西:
if(!expression.global)
expression = eval(expression.toString() + "g");
某些实现可能不支持事件的RegExp.prototype.toString和简单地从Object.prototype中继承它,或它可能完全是一种不同的格式。这看起来是一种不好的编码习惯。
我明白了。好吧,我编辑了这篇文章,所以你可以删除这个下降。 :-) – Witiko 2011-04-29 19:05:08
完成并完成。对不起'回合! – ridgerunner 2011-04-29 19:16:21