Регулярные выражения в JavaScript

Регулярные выражения (regular expressions) — это формальный язык поиска и осуществления манипуляций с подстроками в текстовой строке, основанный на использовании метасимволов (wildcard characters). Для задания правила поиска используется строка-образец («шаблон» или «маска», англ. pattern), состоящая из символов и метасимволов. Для манипуляций с текстом (например, замены) задаётся строка, которая также может содержать в себе специальные символы.

Таким образом, регулярные выражения представляют собой шаблоны, используемые для сопоставления последовательностей символов в строках. В JavaScript регулярные выражения реализованы отдельным объектом RegExp (используются в его методах exec() и test() ), а также интегрированы в методы match(), replace(), search() и split() объекта String.

Методы, использующие регулярные выражения

Метод Описание
exec Метод RegExp, который выполняет поиск совпадения в  строке. Возвращает массив данных.
test Метод RegExp, который тестирует совпадение в строке. Возвращает либо истину (true) либо ложь (false).
match Метод String, который выполняет поиск совпадения в строке. Возвращает массив данных, либо null если совпадения отсутствуют.
search Метод String, который тестирует на совпадение в строке. Возвращает индекс первого совпадения, или -1 если совпадений не будет найдено.
replace Метод String, который выполняет поиск совпадения в строке. Заменяет совпавшую подстроку другой подстрокой, переданной как аргумент в этот метод.
split Метод String, который использует регулярное выражение или фиксированную строку, чтобы разбить строку на массив подстрок.

Читайте также Регулярные выражения на https://learn.javascript.ru.

Синтаксис регулярных выражений в JavaScript

Регулярное выражение (regexp, «регэксп» или «регулярка») состоит из шаблона (pattern или «паттерна») и необязательных флагов (flags).

Варианты синтаксиса регулярных выражений:

с помощью конструктора объекта RegExp:

с помощью литеральной записи /…/ :

Регулярное выражение regexp в обоих случаях является объектом встроенного класса RegExp.

Отличие создания регулярного выражения с помощью литерала и конструктора:

  • Литеральная запись через слеши /…/ не допускает вставок переменных (наподобие возможных в строках через ${…}), в данном случае регулярное выражение является полностью статичным. Слеши используются, когда на момент написания кода точно известно, каким будет регулярное выражение.
  • Конструктор new RegExp позволяет создать регулярное выражение из динамически сгенерированной строки.

Флаги регулярных выражений

Регулярные выражения могут иметь следующие необязательные флаги (flags), которые размещаются после шаблона (pattern):

Флаги влияют на поиск следующим образом:

" i " - поиск не зависит от регистра символов в строке (символы "A" и "a" равнозначны);

[свернуть]
" g " - поиск ищет все совпадения в строке (без флага "g"- только первое);

[свернуть]
" m " - многострочный режим поиска;

Флаг m в регулярных выражениях, переключая поиск в многострочный режим, влияет на поведение следующих символов:

  • ^ — начало строки (текста);
  • $ — конец  строки (текста).

Поиск в начале строки ( ^ ):

В обычном режиме каретка ( ^ ) – это начало всего текста, а в многострочном – начало каждой строки. «Начало строки» формально означает «сразу после перевода строки», то есть проверка ( ^ ) в многострочном режиме верна на всех позициях, которым предшествует символ перевода строки \n.

Поиск в конце строки ( $ ):

Без флага m якорь $ обозначал бы конец всей строки, и была бы найдена только последнее совпадение.

[свернуть]
" y " - режим поиска, начиная с конкретной позиции (индекса) в тексте

Еще пример:

[свернуть]

Использование регулярных выражений в методах объекта RegExp

Поиск совпадения регулярного выражения в указанной строке (метод exec() )

Метод regexp.exec(str) выполняет поиск совпадения регулярного выражения regexp в указанной строке str. Позволяет осуществлять поиск совпадений, начиная с нужной позиции, заданной в свойстве свойстве lastIndex регулярного выражения.

Если сопоставление не удалось (совпадений нет), метод exec() возвращает null. Если сопоставление успешно (совпадения есть), метод exec() возвращает массив и обновляет свойства объекта регулярного выражения.

Синтаксис метода exec() :

Возвращаемый массив содержит:

  • ‘substr’  — все совпавшие в строке символы;
  • [n] — совпавшие подстроки, заданные в регулярном выражении в круглых скобках (если они присутствуют); количество подстрок не ограничено;
  • index — индекс начала совпавшей подстроки в строке (начинается с нуля);
  • input — исходная (оригинальная) строка;
  • groups — именованные группы; именование задается добавлением ?<name> непосредственно после открытия круглой скобки.

Если целью выполнения является просто определить наличие совпадений, то используйте метод RegExp.prototype.test(), либо метод строки String.prototype.search().

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

Если регулярное выражение использует флаг «g», вы можете использовать метод exec() несколько раз для нахождения последовательных сопоставлений в одной и той же строке. При этом метод exec() запоминает позицию после совпадения в свойстве lastIndex регулярного выражения (метод test() также запоминает свойство lastIndex). Поиск начнётся по подстроке строки str, начало которой определяется свойством lastIndex регулярного выражения, например:

Последовательный вызов метода exec() в коде:

Последовательный вызов метода exec() в цикле:

 

[свернуть]
Проверка факта наличия подстроки в указанной строке (метод test() )

Метод regexp.test(str) проверяет есть ли хоть одно совпадение, если да, то возвращает true, иначе — false, например:

[свернуть]

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

Поиск подстроки (метод match() )

Метод str.match(regexp) для строки str возвращает массив совпадений с регулярным выражением regexp, например:

При отсутствии совпадений возвращается не пустой массив, а null.

Особенности метода str.match(regexp):

  1. Если регулярное выражение regexp не содержит флаг g, возвращаемый результат будет тем же самым, что и при вызове метода RegExp.exec().
  2. Если регулярное выражение содержит флаг g, метод вернёт массив, содержащий все совпадения . 
  3. Возвращаемый методом объект (массив) имеет дополнительные свойства:
    • input, которое содержит оригинальную строку;
    • index, которое представляет индекс совпадения в строке (нумерация с нуля);
    • groups , которое содержит массив именованных групп или значение undefined, если именованные группы не были определены.

[свернуть]
Поиск всех совпадений с группами (метод matchAll() )

При поиске всех совпадений (флаг g) метод str.match(regexp) не возвращает скобочные группы.

Пример метода str.match(regexp)

Результат – массив совпадений, но без деталей о каждом совпадении.

[свернуть]

Для получения информации о найденных совпадениях можно использовать метод str.matchAll(regexp).

Отличия метода str.matchAll(regexp) от метода str.match(regexp):

  1. Возвращает не массив, а перебираемый объект RegExpStringIterator {} (не является псевдомассивом!).
  2. При поиске с флагом g возвращает каждое совпадение в виде массива со скобочными группами.
  3. Если совпадений нет, он возвращает не null, а просто пустой перебираемый объект.

Например:

В явном преобразовании через Array.from() нет необходимости, если мы перебираем результаты в цикле, например:

При вызове str.matchAll(regexp) движок JavaScript возвращает перебираемый объект, в котором нет результатов. Поиск совпадений осуществляется по мере того, как мы запрашиваем результаты, например, в цикле. Это позволяет прервать поиск в случае получения нужного результата и освободить ресурсы движка (например, всего в тексте может быть 10 совпадений, а нам нужно всего 3; в цикле после 3-го результата можно использовать break и не искать оставшиеся 7).

[свернуть]
Замена подстроки ( методы replace() и replaceAll() )

Метод str.replace(regexp, replacement) заменяет совпадение с regexp в строке str на replacement , например:

Отличие replaceAll() и replace():

  1. Если аргумент regexp является строкой, replaceAll() заменяет все вхождения из regexp на replacement, в то время как replace() только первое вхождение.
  2. Если аргумент regexp является регулярным выражением без флага g, replaceAll() генерирует исключение TypeError.

В строке замены replacement мы можем использовать специальные комбинации символов для вставки фрагментов совпадения:

Шаблон Замена
$$

Вставляет символ доллара «$»:

$&

Находит совпадение и добавляет после него подстроку замены:

$`

Вставляет вместо совпадения часть строки, предшествующую этому совпадению:

$’

Вставляет вместо совпадения часть строки, следующую за этим совпадением:

$n 

или 

$nn

Символы n или nn являются десятичными цифрами, вставляет n-ную сопоставившуются подгруппу из объекта RegExp в первом параметре:

Для именованных скобок ссылка будет выглядеть как $<имя>:

[свернуть]

Специальные символы в регулярных выражениях

Обратите внимание: некоторые специальные символы некорректно работают с символами, отличающимися от латиницы!

Символьные классы

Символьные классы

Символ Значение
.

(Точка, десятичная запятая) сопоставляется с любым символом, за исключением символов новой строки: \n\r\u2028 или \u2029. Обратите внимание, что флаг многострочности m не изменяет поведение точки: для сопоставления шаблона с несколькими строками используйте набор символов [^] (конечно, если только вам не нужно поддерживать старые версии IE), он сопоставляется с любым символом, включая символы новой строки.

\d

Сопоставляется с символом цифры в базовом латинском алфавите. Эквивалентен набору символов [0-9]. Например, шаблоны /\d/ и /[0-9]/ сопоставляются с подстрокой «2» и «1»:

\D

Сопоставляется с любым символом, который не является цифрой в базовом латинском алфавите. Эквивалентен набору символов [^0-9] (отрицательный набор символов, сопоставляется со всеми символами, кроме заключенных в квадратные скобки; дефис определяет диапазон символов):

\w

Сопоставляется с любым алфавитно-цифровым символом из базового латинского алфавита, включая символ подчёркивания. Эквивалентен набору символов [A-Za-z0-9_]:

\W

Сопоставляется с любым символом из базового латинского алфавита, не являющимся символом, из которых состоят слова. Эквивалентен набору символов [^A-Za-z0-9_]:

\s

Сопоставляется с одиночным пробельным символом, который включает в себя пробел, табуляцию, подачу страницы, перевод строки и другие пробельные символы Юникода. Эквивалентен набору символов [\f\n\r\t\v​\u00a0\u1680​\u180e\u2000​\u2001\u2002​\u2003\u2004​\u2005\u2006​\u2007\u2008​\u2009\u200a​\u2028\u2029​​\u202f\u205f​\u3000]:

\S

Сопоставляется с одиночным символом, не являющимся пробельным. Эквивалентен набору символов [^ \f\n\r\t\v​\u00a0\u1680​\u180e\u2000​\u2001\u2002​\u2003\u2004​\u2005\u2006​\u2007\u2008​\u2009\u200a​\u2028\u2029​\u202f\u205f​\u3000]:

\t

Сопоставляется с символом табуляции \u0009:

\r

Сопоставляется с символом возврата каретки \u000D (для возвращения позиции устройства к началу строки, обозначается также как CR (carriage return):

\n

Сопоставляется с символом перевода строки \u000A:

\v

Сопоставляется с символом вертикальной табуляции \u000B.

\f Сопоставляется с символом подачи страницы.
[\b] Сопоставляется с символом забоя (стирание предыдущего символа), не перепутайте его с символьным классом границы слова \b.
\0 Сопоставляется с нулевым символом. Не ставьте за ним другую цифру.
\cX

Соответствует управляющему символу ASCII, где X является буквой от «A» до «Z». Например, шаблон /\cJ/ сопоставляется с символом перевода строки \x0A  (ASCII):

\xhh Сопоставляется с символом с кодом hh (две шестнадцатеричные цифры).
\uhhhh Сопоставляется с символом со значением Юникода hhhh (четыре шестнадцатеричные цифры).
\

 Обратный слэш указывает для символов:

  • которые обычно трактуются буквально, — что следующий символ является специальным и не должен интерпретироваться буквально (например, шаблон /b/ сопоставляется с символом «b», а /\b/, символ приобретёт специальное значение, обозначающее сопоставление с границей слова;
  • которые обычно трактуются специальным образом, — что следующий символ не является специальным и должен интерпретироваться буквально (например, «*» является специальным символом, обозначающим ноль или более вхождений предшествующего символа при сопоставлении; поэтому шаблон /a*/ означает сопоставление с нулём или более символов «a»;  шаблон /a\*/ сопоставляется со строкой «a*».

[свернуть]
Наборы символов

Наборы символов
Символ Значение
[xyz]

Набор символов, который сопоставляется с любым из заключённых в квадратные скобки символов. С помощью дефиса можно определить диапазон символов (шаблон [абвгд] означает тоже самое, что и шаблон [а-д]):

[^xyz]

Отрицательный или дополнительный набор символов: сопоставляется со всеми символами, что не заключены в квадратные скобки. С помощью дефиса можно определить диапазон символов (шаблон [^абвгд] означает тоже самое, что и шаблон [^а-д].

[свернуть]
Границы в строках

Границы
Символ Значение
^

Сопоставляется c началом ввода. Если установлен флаг многострочности, также сопоставляется с позицией сразу за символом переноса строки:

$

Сопоставляется c концом ввода. Если установлен флаг многострочности, также сопоставляется с позицией сразу перед символом переноса строки:

\b

Соответствует пустой строке (не пробелу!) в начале или конце слова. Сопоставляется с границей слова нулевой ширины, например, с позицией между буквой и пробелом (не путайте его с набором символов [\b]):

\B

Соответствует пустой строке (не пробелу!) не в начале или конце слова. Сопоставляется с позицией между двумя буквами или двумя пробелами:

[свернуть]
Группировка и обратные ссылки

Группировка и обратные ссылки
Символ Значение
(x)

 «Захватывающие скобки». Сопоставляется с x и запоминает сопоставление. Совпавшую подстроку можно достать из элементов [1], …, [n] результирующего массива или из предопределённых свойств $1, …, $9 объекта RegExp. Захват групп ведёт к снижению производительности. Если вам не нужно повторно ссылаться на захваченную подстроку, лучше использовать скобки без захвата.

\n

Где n является целым положительным числом. Обратная ссылка на последнюю сопоставившуюся подстроку в n-ных по счёту круглых скобках в регулярном выражении (нумерация скобок идет слева направо):

(?:x)

«Незахватывающие скобки».  Сопоставляется с x, но не запоминает сопоставление. Совпавшую подстроку нельзя достать из элементов [1], …, [n] результирующего массива или из предопределённых свойств $1, …, $9 объекта RegExp:

[свернуть]
Квантификаторы (повтор символа, символьного класса или группы)

Квантификатор определяет, сколько раз предшествующее выражение может встречаться после символа, символьного класса или группы. 

Квантификатор может относиться более чем к одному символу в регулярном выражении, только если это символьный класс или группа.

Квантификаторы
Символ Значение
x*

Сопоставляется с предшествующим элементом x ноль или более раз:

x+

Сопоставляется с предшествующим элементом x один или более раз. Эквивалентен квантификатору {1,}:

x*?
x+?

Сопоставляется с предшествующим элементом x подобно квантификаторам * и +, описанным выше, однако ищет минимально возможное сопоставление:

x?

Сопоставляется с предшествующим элементом x ноль или один раз. Если символ используется сразу после какого-то из квантификаторов *, +, ?, или {}, то он делает этот квантификатор «нежадным» (сопоставление происходит минимально возможное количество раз), в противоположность «жадному» поведению квантификатора по умолчанию (сопоставление происходит максимально возможное количество раз). Также символ используется в квантификаторах предпросмотра (?=), (?!) и (?:).

x(?=y)

Сопоставлется с x, только если за x следует y:

x(?!y)

Совпадает с x, только если за x не следует y:

(?<=y)x

Совпадает с x, только если x предшествует y:

(?<!y)x

Совпадает с x, только если x не предшествует y:

x|y

Совпадает либо с x, либо с y:

x{n}

Совпадает точно с n вхождениями предшествующего элемента xде n  — целое положительное число):

x{n,}

Совпадает не менее, чем с n вхождениями предшествующего элемента xде n  — целое положительное число):

x{n,m}

Совпадает не менее, чем с n , и не более, чем с m вхождениями предшествующего элемента xде m и n  — целые положительные числа):

[свернуть]

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.