RexExp в js [как заменить слова целиком в строке?]

function changeKey(string) {

var keywords = ['and', 'array', 'begin', 'case', 'class', 'const',

'div', 'do', 'else', 'end', 'for', 'function', 'if', 'implementation', 'interface', 'mod', 'not', 'of', 'or',

'procedure', 'program', 'record', 'repeat', 'shl', 'shr', 'string', 'then', 'to', 'type', 'unit', 'until', 'uses',

'var', 'with', 'while'];


var edited = string;

for (let i = 0; i < keywords.length; i++) {

edited = edited.replace(new RegExp(keywords[i], "gi"), `<span class="keywords">${keywords[i]}</span>`);

}

return edited;

}

здравствуйте! вот я написал функцию, чтобы отформатировать некий текст. все отлично форматируется, но проблема в том что форматируются все совпадения, и получается не отформатированный текст, а какая-то абракадабра
пробовал вставить перед началом цикла
keywords = keywords.map(x => “\b” + x + “\b”); /поиск именно слов, а не сочетаний букв/
но тогда текст вообще не форматируется. подскажите, пожалуйста, как решить проблему. буду благодарен

P.S. я, конечно, могу все это организовать без цикла тупо прописывая замену для каждого эл-та массива (тогда можно будет не создавать регулярки, а все вручную прописывать, и словами, а не эл-тами массива), но во-первых, это займет уйму времени, а во-вторых, я не думаю, что это практично

Одна из проблем что в заменяемой строке есть такие слова которые тоже потребуют замены: class. После каждого переприсвоения class будет заменен на следующей итерации.

Этот код не сработал из-за особенностей эскейпинга (escape) строк. Если хочешь собирать регулярки из строк в которых есть контрольные символы, то нужно использовать двойной эскейп.

var s = 'We go and then begin and array if implementation is right'
s.split(new RegExp('\b')) // не работает как ожидается
s.split(new RegExp('\\b')) // работает

По самой проблеме. Лучше разбить строку на слова, заменить в массиве слова из массива и снова собрать строку.

var keywords = ['and', 'array', 'begin', 'case', 'class', 'const', 'div', 'do', 'else', 'end', 'for', 'function', 'if', 'implementation', 'interface', 'mod', 'not', 'of', 'or', 'procedure', 'program', 'record', 'repeat', 'shl', 'shr', 'string', 'then', 'to', 'type', 'unit', 'until', 'uses', 'var', 'with', 'while'];
var s = 'We go and then begin and array if implementation is right'
s.split(/\b/).map(w => {
    if (keywords.indexOf(w.toLowerCase()) !== -1) {
        return `<span class="keywords">${w}<span>`
    } else {
        return w
    }
}).join('')
1 симпатия

хорошо, спасибо, буду разбираться