Хороший вопрос об одной тонкой (не очень) особенности JavaScript.
Результаты так чередуются потому, что объект регулярного выражения
re
с флагом
g
сохраняет состояние – свойство
lastIndex
– позицию, где последний раз был найден результат. И дальше ищет начиная с этого места.
Чтобы работало «нормально», можно сбрасывать это свойство перед очередным поиском:
for (var i=0; i<10;i++) {
+ re.lastIndex = 0; // каждый раз начинать искать с 0
var txt = re.exec(a);
Подробнее:
https://learn.javascript.ru/regexp-methods#regexp-...