var re=/\[[a-zA-Z0-9\s]+\]\(@\d+\.\d+\)/ var md = 'bla bla bla [rel link 1](@2.1) bla bla [link 2](@3.4)' var matches; var firstMatch; var matchIndex; var remaining = md; var bits = []; var beforeMatch; var afterMatch; do { matches = re.exec(remaining); if(! matches) { break; } firstMatch = matches[0]; matchIndex = remaining.indexOf(firstMatch); beforeMatch = remaining.slice(0, matchIndex); remaining = remaining.slice(firstMatch.length + matchIndex); bits.push({ md: beforeMatch }); bits.push({ link: firstMatch }); } while(1) console.log(bits);