Для себя можно так:
var selection = getSelection();
new Set(
document.body.textContent.match(/\b10\.[^\/\s]+\/[^\/\s]+/g)
).forEach(
match => {
while(find(match)){
var link = document.createElement('a');
link.href = 'http://dx.doi.org/' + match;
selection.getRangeAt(0).surroundContents(link);
}
selection.collapse(document.body);
}
);
window.scrollTo(0, 0);
Если текст простой - можно обойтись перебором текстовых нод.
Если регулярка сложная - нужно добавить обработку случаев, когда одно совпадение находится в другом.)