Комплексное совпадение известных строк в JS с использованием Regex - PullRequest
0 голосов
/ 29 февраля 2020

Я работаю над сценарием замены имени для онлайн-платформы TTRPG, но я плохо знаком с Regex.

В настоящее время у меня есть следующий код, который во многих случаях корректно заменяет имя:

el.innerHTML = el.innerHTML.replace(new RegExp("\\b" + data.alias + "\\b", "gi"), replacement);

В этом примере:
data.alias - это имя "существа", оно может быть таким простым, как Bandit, или сложным, как Goblin King (Variant 1).

replacement - выбранная пользователем строка, например Unknown Creature

Пример el может выглядеть примерно так: <h4>Bandit</h4>

или может быть: <p>The Goblin King (Variant 1) is known to lair in the dank, dark cave</p>

Следующие проблемы вызывают у меня горе, пытаясь найти правильный шаблон соответствия:
1. Для имени с общим словом, например bandit Я не хочу, чтобы шаблон соответствовал такому слову, как banditry
2. Для имен, которые не имеют словесных символов (таких как (), мое текущее совпадение границы слова не выполняется. Я не уверен, является ли разумным выбором простое экранирование всех специальных символов

Существует ли шаблон, который может точно соответствовать именам, учитывая, что имя является известным количеством?

1 Ответ

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

Это должно быть возможно, если вы используете отрицательный взгляд вперед и взгляд назад вместо границ слов. Однако вам нужно будет экранировать специальные символы регулярных выражений, такие как скобки в Goblin King (Variant 1).

. Попробуйте:

el.innerHTML = el.innerHTML.replace(new RegExp("(?![^\\s,.!?;:])" + data.alias + "(?<![^\\s,.!?;:])", "gi"), replacement);

Демоверсии: https://regex101.com/r/xlvAdt/1 https://regex101.com/r/zvHL1q/1

По сути, шаблон говорит, что нужно искать данную строку, если ей не предшествует или не следует что-либо, что не является символом пробела или пунктуация.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...