Книга: Выразительный JavaScript

Динамическое создание объектов RegExp

Динамическое создание объектов RegExp

В некоторых случаях точный шаблон неизвестен во время написания кода. Например, вам надо будет искать имя пользователя в тексте, и заключать его в подчёркивания. Так как вы узнаете имя только после запуска программы, вы не можете использовать запись со слэшами.

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

var name = "гарри";
var text = "А у Гарри на лбу шрам.";
var regexp = new RegExp("b(" + name + ")b", "gi");
console.log(text.replace(regexp, "_$1_"));
// ? А у _Гарри_ на лбу шрам.

При создании границ слова приходится использовать двойные слэши, потому что мы пишем их в нормальной строке, а не в регулярке с прямыми слэшами. Второй аргумент для RegExp содержит опции для регулярок – в нашем случае “gi”, т. е. глобальный и регистронезависимый.

Но что, если имя будет "dea+hl[]rd" (если наш пользователь – кульхацкер)? В результате мы получим бессмысленную регулярку, которая не найдёт в строке совпадений.

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

var name = "dea+hl[]rd";
var text = "Этот dea+hl[]rd всех достал.";
var escaped = name.replace(/[^ws]/g, "$&");
var regexp = new RegExp("b(" + escaped + ")b", "gi");
console.log(text.replace(regexp, "_$1_"));
// ? Этот _dea+hl[]rd_ всех достал.

Оглавление книги


Генерация: 1.168. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз