Проблема в том, что в объекте регэкспа хранится смещение до следующего глобального поиска.
Я эту проблему решил так:
RegExp.prototype.reset = function() {
this.lastIndex = 0;
return this;
};
и всякий раз, когда нужно работать с глобальным регэкспом:
...
expr.reset().test(prop) ? prop.replace( ...
...