You don't need a loop, you can use the string's match method, but in order to get only the matched group you have to use a lookbehind, which javascript's implementation of regex doesn't support, but, it does support a lookahead, so basically, you could reverse it, reverse all the matches and filter out empty strings to get the reservation codes. Since you only have a single match for the names you don't need a loop for that either, assuming there will always be a match, so you can just use exec and pop the result off the end..
const str = `30 OCT 2017 04 NOV 2017
Distance (in Miles):500
Stop(s): 0
Distance (in Miles):500
Stop(s):0
TRIP TO KRAKOW, POLAND
PREPARED FOR
DOE/JANE MRS
APPLESEED/JOHN MR
RESERVATION CODE UVWXYZ
AIRLINE RESERVATION CODE DING67 (OS)
AIRLINE RESERVATION CODE HDY75S (OS)`;
var r1 = / (.*)(?= EDOC NOITAVRESER ENILRIA)/g,
r2 = /PREPARED FOR([^]*?)RESERVATION/g;
const rev = s=>s.split('').reverse().join('').trim();
let x = r2.exec(str).pop();
let m = rev(str).match(r1).map(rev).filter(w=>w.length);
console.log(x);
console.log(m);