Сопоставление одного из нескольких символов с классом символов

Отрывок из книги Обработка текста в JavaScript Фараза Кельхини

Задача

Предположим, вы хотите найти слово в документе, даже если оно написано с ошибкой. Например, слово «лицензия» — одно из самых ошибочных слов в английском языке. Вы хотите написать в документе шаблон, соответствующий словам «лицензия», «лицензия», «лицензия» или «лицензия».

Решение

Используйте класс символов:

const re = /li[sc]en[sc]e/;

re.test("A driver's license"); // → true 
re.test("A driver's lisense"); // → true 
re.test("A driver's licence"); // → true 
re.test("A shopping list"); // → false

Класс символов соответствует только одному из указанных символов. В этом коде указанными символами являются «s» и «c», поэтому регулярное выражение соответствует «лицензии», «лицензии», «лицензии» или «лицензии», но не «лицензии». Имейте в виду, что классу символов соответствует только один символ.

Обсуждение

Некоторые персонажи меняют поведение класса персонажей. Если вы поместите курсор (^) после открывающей квадратной скобки, это сведет на нет весь класс символов. Это означает, что класс символов будет соответствовать любому символу, который не является одним из указанных символов.

Таким образом, /[^license]/ будет соответствовать любому символу, кроме «l», «i», «c», «n», «s» и «e»:

const re = /[^license]/;

re.test("lie"); // → false
re.test("list"); // → true

Этот шаблон соответствует «t» в «списке», поэтому test() возвращает true. Вы могли заметить, что курсор (^) совпадает с кареткой, которая соответствует началу строки (из Рецепта 24, Определение начала или конца строки с помощью ^ и $). Хотя иероглиф тот же, смысл его совершенно разный.

Точно так же, как английское слово «рука» может означать разные вещи в зависимости от контекста, в котором оно используется (иногда часть тела, иногда — оружие).

Также имейте в виду, что курсор имеет особое значение только тогда, когда он используется сразу после открывающей скобки класса символов. Таким образом, /[a^bc]/ не будет отменять класс символов, поскольку «^» будет рассматриваться как буквальный символ.

Как и в случае с обычным классом, для успеха отрицательный класс должен соответствовать символу. Например, шаблон /Number[⁵]/ соответствует «Номер6», но не «Число», поскольку класс ожидает символ:

const re = /Number[⁵]/;

re.test("Number6"); // → true
re.test("Number"); // → false

Используйте класс символов, чтобы сопоставить один символ из нескольких символов, например, если вы хотите учесть слова с ошибками или различия в написании в американском и британском английском языке.

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

Мы надеемся, что вам понравился этот отрывок из книги Обработка текста в JavaScript Фараза Кельхини. Вы можете приобрести электронную книгу непосредственно на сайте The Pragmatic Bookshelf:



В период бета-тестирования читатели могут оставлять комментарии и предложения на странице книги на DevTalk: