我想创建一个String方法,它接受一个RegExp和一个回调,然后通过RegExp拆分String,并在split数组中插入回调的返回。简而言之,它会做这样的事情:
"a 1 b 2 c".method(/\d/, function ($1) { return $1 + 1; })
=> [a, 2, b, 3, c]
如果String与RegExp不匹配,它应该返回一个数组,如下所示:
"a b c d e".method(/\d/, function ($1) { return $1 + 1; })
=> ["a b c d e"]
我编写了这段代码,但它并没有像我想的那样工作:
String.prototype.preserveSplitReg = function(reg, func) {
var rtn = [],
that = this.toString();
if (!reg.test(that)) {
console.log(reg, that, reg.test(that));
return [that];
}
...
}
当String与reg
不匹配时,应该只调用console.log,对吧?但有时它会记录(reg, that, true)
。麻烦的字符串和reg
是:
"See <url>http://www.w3.org/TR/html5-diff/</url> for changed elements and attributes, as well as obsolete elements and"
/<url>.*?<\/url>/g
控制台记录为true。我无法弄清楚为什么。任何帮助都将受到高度赞赏。
答案 0 :(得分:6)
这是due to a bug in Javascript RegEx engine (ECMAScript3)
基本上使用g
修饰符的正则表达式无法正确重置,因此多个test()
调用会在true and false
之间切换。