Вы используете глобальный флаг.В результате регулярное выражение совпадает только с определенным индексом.После каждого матча pat.lastIndex == 19
, затем pat.lastIndex == 0
и т. Д.
Более простой пример:
var r = /\d/g;
r.exec("123"); // 1 - lastIndex == 0, so matching from index 0 and on
r.exec("123"); // 2 - lastIndex == 1, ditto with 1
r.exec("123"); // 3 - lastIndex == 2, ditto with 2
r.exec("123"); // null - lastIndex == 3, no matches, lastIndex is getting reset
r.exec("123"); // 1 - start all over again