Почему утверждение if (! Condition) {console.log(condition)} отображает true

Я хочу создать метод String, который принимает RegExp и обратный вызов, а затем разбивает String на RegExp и вставляет обратный вызов в split array. Короче говоря, он сделал бы что-то вроде этого:

"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];
    }

    ...
}

Консоль .log следует вызывать ТОЛЬКО, когда строка не соответствует reg, правильно? Но иногда он регистрирует (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

консольные журналы истинны. Я не могу понять, почему. Любая помощь будет высоко оценена.

Ответ 1

Это из-за ошибки в Javascript RegEx engine (ECMAScript3)

В основном регулярное выражение с модификатором g не соответствует reset правильно, поэтому несколько вызовов test() переключаются между true and false.