Как использовать регулярные выражения с массивом ключевых слов для замены? - PullRequest
0 голосов
/ 25 февраля 2020

Я пытаюсь создать al oop, который заменит определенные слова их заглавной версией. Однако я не могу заставить его работать с группами захвата, так как мне нужно только прописные слова, окруженные пробелами или маркером начала строки. Если я правильно понимаю, \b это сопоставление границ? Приведенный ниже список для удобства сокращен.

raw_text = 'crEate Alter Something banana'
var lower_text = raw_text.toLowerCase();
var sql_keywords = ['ALTER', 'ANY', 'CREATE']
for (i = 0; i < sql_keywords.length; i++){
    search_key = '(\b)' + sql_keywords[i].toLowerCase() + '(\b)';
    replace_key = sql_keywords[i].toUpperCase();
    lower_text = lower_text.replace(search_key, '$1' + replace_key + '$2');
}

Цикл работает нормально, но замена не удалась. Я предполагаю, что отформатировал это неправильно, но я не могу понять, как правильно отформатировать это. Для ясности, он ищет слово, окруженное либо началом строки, либо пробелом, а затем заменяет слово версией в верхнем регистре, сохраняя границы.

Ответы [ 2 ]

3 голосов
/ 25 февраля 2020

Несколько проблем:

  • Бэкслла sh внутри строкового литерала является escape-символом, поэтому, если вы намереваетесь использовать литеральный бэкслла sh (для генерации синтаксиса регулярных выражений) , вам нужно удвоить его
  • Вы не создали регулярное выражение. Динамическое c регулярное выражение создается с вызовом RegExp
  • . Вы можете указать флаги опций регулярного выражения, в том числе g для глобального, и вы также можете упростить задачу, добавив * 1010 Флаг * (без учета регистра).
  • Нет причин делать группу захвата из \b, так как она не представляет никакой символ из ввода. Таким образом, даже если ваш код будет работать, тогда $1 и $2 просто разрешат пустые строки - они бесполезны.
  • Вы приводите входные данные ко всем строчным буквам, поэтому вы потеряете использование заглавных букв в словах, которые не совпадают.

Будет проще, если вы создадите одно регулярное выражение для всех одновременно и используете аргумент обратного вызова replace:

var raw_text = 'crEate Alter Something banana';
var sql_keywords = ['ALTER','ANY','CREATE'];
var regex = RegExp("\\b(" + sql_keywords.join("|") + ")\\b", "gi");
var result = raw_text.replace(regex, word => word.toUpperCase());

console.log(result);

Кстати, вы, вероятно, также хотите сопоставить зарезервированные слова, когда они сопровождаются пунктуацией, такой как запятая. \b будет соответствовать любому переключению между буквенно-цифровым и не-буквенно-цифровым, и наоборот, так что это выглядит нормально.

0 голосов
/ 25 февраля 2020

Вы можете использовать конструктор RegExp.

Затем создать функцию:

const listRegexp = list => new RegExp(list.map(word => `(${word})`).join("|"), "gi");

Затем использовать ее:

const re = listRegexp(sql_keywords);

Затем заменить:

const output = raw_text.replace(r, x => x.toUpperCase())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...