Js RegExp почему не всегда один результат?
RegExp в JavaScript сохраняет своё состояние между вызовами. Так как выражение содержит флаг глобального соответствия g, после очередного найденного совпадения поиск продолжается.
У экземпляра объекта Regexp есть свойство lastIndex, которое позволяет читать/писать индекс, с которого начнётся следующее сопоставление. Он поможет разобраться:var RE = /([A-z0-9])/g;
console.log([
  RE.lastIndex, RE.test("aaaa"), // 0,true
  RE.lastIndex, RE.test("aaaa"), // 1,true
  RE.lastIndex, RE.test("aaaa"), // 2,true
  RE.lastIndex, RE.test("aaaa"), // 3,true
  RE.lastIndex, RE.test("aaaa"), // 4,false
  RE.lastIndex, RE.test("aaaa"), // 0,true
]);
Из-за /g 
https://stackoverflow.com/questions/1520800/why-re...