RegExp, replaceAll, replace, exec, search, test и т. Д.

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

Хотя Perl и Python являются полнофункциональными языками, когда дело доходит до регулярных выражений, в JavaScript есть множество инструментов.

Вы знаете все возможности JavaScript? Вы хотите узнать разницу между каждым из инструментов?

В этой статье мы не будем углубляться в синтаксис регулярных выражений, а будем разбираться в том, какие инструменты вы можете использовать в JavaScript, чтобы извлечь из них максимальную пользу. Поначалу регулярные выражения могут немного утомлять. Мы увидим, как их эффективно создавать и использовать.

Создание выражений регулярных выражений

Первый шаг к овладению регулярным выражением - это возможность создавать эти выражения регулярных выражений. Когда дело доходит до создания регулярного выражения, у вас есть два варианта:

1. Использование литералов регулярных выражений

Когда мы знаем, что наше выражение не будет выполняться во время выполнения, мы можем создать их, используя regular expression literals. Синтаксис прост; регулярное выражение заключено между косой чертой. Флаги, если они есть, добавляются в конце.

/pattern/flags

Давайте посмотрим на пример:

Это называется буквальным обозначением. Регулярное выражение будет проанализировано и вычислено во время компиляции. Это означает, что это будет очень эффективное решение.

2. Использование обычного конструктора

Если ваше регулярное выражение настроено на изменение во время выполнения или полагается на переменную времени выполнения, мы можем использовать RegExp API. Первый аргумент - это выражение. Есть необязательный второй параметр для установки флагов.

new RegExp(pattern [, flags])
// factory notation without the new keywod is possible
RegExp(pattern [, flags])

Давайте посмотрим на пример:

Компиляция выражения здесь будет происходить во время выполнения; он будет медленнее во время выполнения.

Еще одним недостатком использования конструктора RegExp является необходимость экранирования специальных символов. Например, нам нужно \\s вместо \s. Отметьте здесь, чтобы узнать, что нужно избежать.

Пример объявления одного и того же регулярного выражения с использованием двух вариантов:

Метод создания выражения регулярного выражения не влияет на его возможности или способы использования. Любое регулярное выражение всегда будет иметь один и тот же прототип: RegExp.prototype.

Поддерживаемые флаги в JavaScript

Раньше мы говорили о регулярных выражениях и флагах. Флаги не обязательны и должны быть написаны строчными буквами; в противном случае они будут недействительными.

Давайте проверим различные флаги, принимаемые движком JavaScript:

  • i: делает поиск нечувствительным к регистру
  • g: ищет все совпадения вместо возврата первого.
  • m: многострочный режим.
  • s: включает режим «dotall». Это позволяет . соответствовать символу новой строки \n
  • u: включает полную поддержку Unicode.
  • y: включает липкий режим: выражение начнет поиск с указанного свойства lastIndex.

Методы JavaScript

Теперь, когда мы знаем, как создавать регулярные выражения, давайте посмотрим, что мы можем с ними делать. Есть восемь методов, которые принимают регулярное выражение:

  • Два из RegexExp.prototype.
  • Шесть из String.prototype.

Давайте посмотрим на них подробнее:

1. test ()

  • использовать только с регулярным выражением

Там test() метод полезен, поскольку нас беспокоит только то, соответствует ли данная цель нашим критериям. Он просто вернет истину или ложь.

Как обсуждалось ранее, приведенный выше код аналогичен следующему:

2. exec ()

  • использовать только с регулярным выражением

Метод exec() используется для перебора результатов поиска путем выполнения нескольких вызовов. Если возврат null, значит, вы достигли конца. Если не null, вы получите latIndex позицию и совпадение результата. Он поддерживает группировку.

3. матч ()

  • использовать только с регулярным выражением

Метод match() возвращает массив со всеми совпадающими вхождениями вместо одного за раз, например exec. Никакая дополнительная информация о матче не возвращается. Если не используется с флагом g, он возвращает группы захвата.

4. matchAll ()

  • использовать только с регулярным выражением

Метод matchAll() похож на метод exec, хотя вместо этого он даст нам итератор. Затем мы можем просмотреть все результаты, используя цикл for. Он действительно возвращает группы захвата.

5. поиск ()

  • использовать только с регулярным выражением

Метод search() полезен, когда вы хотите найти позицию совпадения в строке. Он похож на метод indexOf, но использует регулярное выражение вместо простых строк. Он вернет -1, если индекс не найден или начальная позиция совпадения.

6. заменить ()

  • использовать с регулярным выражением или строкой

Метод replace() возвращает новую строку, в которой некоторые или все совпадения заменены заданной заменой. Он предназначен для строк или литералов регулярных выражений. При использовании с первым будет заменено только первое вхождение.

7. replaceAll ()

  • использовать с регулярным выражением или строкой

Метод replaceAll() аналогичен методу replace(). Есть два ключевых отличия:

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

Обратите внимание, что метод replaceAll только что был добавлен в последние спецификации ES2021.

8. split ()

  • использовать с регулярным выражением или строкой

Метод split() делит строку, используя шаблон поиска. Он вернет упорядоченный массив подстрок. Деление можно выполнить с помощью строки или регулярного выражения.

Методы match(), matchAll() и search() принимают в качестве аргументов регулярное выражение и строки. Однако, если задано не регулярное выражение, строка будет преобразована в RegExp с использованием new RegExp(argument).

Чтобы предотвратить это, если они доступны, например search(), при использовании строк лучше использовать их строковые аналоги.

Возможности ECMAScript

Именованные группы захвата

Группы захвата - это полезная функция регулярных выражений. В спецификации ES2018 была представлена ​​функция захвата именованных групп. Это позволяет именам групп иметь более согласованный доступ.

Утверждения обратного просмотра регулярного выражения

Lookahead уже присутствует во всех основных браузерах. Lookbehind был выпущен как часть спецификации ES2018. Это позволяет нам основывать наши выражения регулярных выражений на том, что стоит за совпадением. Он работает в направлении, противоположном просмотру вперед. Он может принимать положительные и отрицательные условия.

RegExp свойство unicode экранирует

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

Индексы соответствия RegExp

Он еще не выпущен и будет поставляться со спецификацией ES2022. Используя недавно добавленный флаг d, мы можем получить доступ к индексным позициям совпадения start и end.

Он работает даже с группами захвата и именованными группами.

Последние мысли

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

В JavaScript все еще отсутствуют некоторые функции. Тем не менее, он быстро покрывает почву. На горизонте есть несколько захватывающих, например, Match Indices.

Единственное предостережение относительно некоторых новых функций состоит в том, что они не всегда тривиальны для полифилла. Это случай взгляда позади одного.

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

Спасибо за прочтение.