Сопоставление одного из нескольких символов с классом символов
Отрывок из книги Обработка текста в 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:
Обработка текста с помощью JavaScript Книжный портал | Devtalk
Книга «Обработка текста с помощью JavaScript, опубликованная PragProgdevtalk.com»