/o([0-9]+?)__/g
This should work. Click here and search for "lazy star".
var rx = new RegExp( /o([0-9]+?)__/g );
var txt = "Local residents o1__have called g__in o22__with reports...";
var mtc = [];
while( (match = rx.exec( txt )) != null ) {
alert( match[1] );
mtc.push(match[1]);
}
Jek-fdrv pointed out in the comments, that if you call rx.test just before the while loop some results are skipped. That's because RegExp object contains a lastIndex field that keeps track of last match's index in the string. When lastIndex changes then RegExp keeps matching by starting from it's lastIndex value, therefore a part of the string is skipped. A little example may help:
var rx = new RegExp( /o([0-9]+?)__/g );
var txt = "Local residents o1__have called g__in o22__with reports...";
var mtc = [];
console.log(rx.test(txt), rx.lastIndex); //outputs "true 20"
console.log(rx.test(txt), rx.lastIndex); //outputs "true 43"
console.log(rx.test(txt), rx.lastIndex); //outputs "false 0" !!!
rx.lastIndex = 0; //manually reset lastIndex field works in Chrome
//now everything works fine
while( (match = rx.exec( txt )) != null ) {
console.log( match[1] );
mtc.push(match[1]);
}