Введение

Если бы я мог определить регулярное выражение в трех предложениях, я бы определил его как BAE. Регулярные выражения делают кодирование проще и короче. Регулярные выражения — это избавление от стресса.

Оставив в стороне мои собственные определения…

Регулярное выражение (regex или сокращенно regexp) — это специальная текстовая строка для описания шаблона поиска или определенного количества текста. Их название происходит от математической теории, на которой они основаны. Вы можете думать о регулярных выражениях как о подстановочных знаках на стероидах. Вы, вероятно, знакомы с подстановочными знаками, такими как *.txt, для поиска всех текстовых файлов в файловом менеджере. Эквивалент регулярного выражения: ^.*\.txt$.

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

Способы построения регулярного выражения:

  1. с литералом регулярного выражения, который состоит из шаблона, заключенного между косыми чертами, следующим образом:
var re = /ab+c/;

Литералы регулярных выражений обеспечивают компиляцию регулярного выражения при загрузке скрипта.

2. вызов функции-конструктора объекта RegExp следующим образом:

var re = new RegExp('ab+c');

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

Двенадцать символов имеют особое значение в регулярных выражениях: обратная косая черта \, знак вставки ^, знак доллара $, точка или точка ., вертикальная черта или символ вертикальной черты |, вопросительный знак ?, звездочка или звездочка *, знак плюс +, открывающая скобка (, закрывающая скобка), открывающая квадратная скобка [ и открывающая фигурная скобка {. Эти специальные символы часто называют «метасимволами». Большинство из них являются ошибками при использовании в одиночку.

\ символ обратной косой черты escape. Обратная косая черта придает особое значение символу, следующему за ней. Например, комбинация \n означает новую строку, один из управляющих символов. Комбинация \w означает символ слово, одну из удобных escape-последовательностей, а \1 — один из специальных символов замены. Пример: регулярное выражение aa\n пытается сопоставить две последовательные буквы a в конце строки, включая сам символ новой строки. Пример: a\+ соответствует a+, а не ряду единиц или a.

^ знак вставки является RegExp_Anchors.html">привязкой к началу строки или символом отрицания. Пример: ^a соответствует a в начале строки. Пример: [⁰-9] соответствует любой нецифре.

$ знак доллара является RegExp_Anchors.html">привязкой к концу строки. Пример: b$ соответствует b в конце строки. Пример: ^$ соответствует пустой строке.

{ } открывающая и закрывающая фигурные скобки используются как квантификаторы диапазона. Пример: a{2,3} соответствует aa или aaa.

[ ] открывающая и закрывающая квадратные скобки определяют класс символов, соответствующий одиночному символу. Знак «^» в качестве первого символа после «[» отменяется, и совпадение выполняется для символов, не перечисленных. «-» обозначает диапазон символов. Внутри конструкции класса символов «[]» большинство специальных символов интерпретируются как обычные символы. Пример: «[d-f]» совпадает с «[def]» и соответствует «d», «e» или «f». Пример: «[a-z]» соответствует любым символам нижнего регистра в алфавите. Пример: «[⁰-9]» соответствует любому символу, который не является цифрой ASCII.

( ) открывающая и закрывающая скобки используются для группировки символов (или других регулярных выражений). На группы можно ссылаться как на этапе поиска, так и на этапе замены. Также существует специальная конструкция со скобками Пример: «(ab)\1» соответствует «abab».

. точка соответствует любому символу, кроме символа новой строки. Пример: «.a» соответствует двум последовательным символам, последним из которых является «a». Пример: «.*\.txt$» соответствует всем строкам, оканчивающимся на «.txt».

* звездочка — это квантификатор совпадения ноль или более. Пример: ^.*$ соответствует целой строке.

+ знак "плюс" — это квантификатор соответствия "один или несколько".

? вопросительный знак соответствует квантификатору "нуль или один". Знак вопроса также используется в специальных конструкциях со скобками и в изменении поведения при сопоставлении.

| вертикальная черта разделяет ряд альтернатив. Пример: «(a|b|c)a» соответствует «aa», «ba» или «ca».

‹ › меньший и больший знаки являются RegExp_Anchors.html">якорями, которые определяют левую или правую границу слова.

- знак минус указывает диапазон в классе символов (если он не находится в первой позиции после открывающей скобки «[» или в последней позиции перед закрывающей скобкой «]». Пример: «[ AZ]» соответствует любому символу в верхнем регистре Пример: «[AZ-]» или «[-AZ]» соответствует любому символу в верхнем регистре или «-».

& амперсанд — это символ «заменить полное совпадение».

Классы символов или наборы символов

«Класс символов» соответствует только одному из нескольких символов. Чтобы соответствовать a или e, используйте [ae]. Вы можете использовать это в gr[ae]y, чтобы соответствовать либо серому, либо серому. Класс символов соответствует только одному символу. gr[ae]y не соответствует graay, graey или чему-то подобному. Порядок символов внутри класса символов не имеет значения.

Вы можете использовать дефис внутри класса символов, чтобы указать диапазон символов. [0–9] соответствует одной цифре от 0 до 9. Можно использовать несколько диапазонов. [0–9a-fA-F] соответствует одной шестнадцатеричной цифре без учета регистра. Вы можете комбинировать диапазоны и отдельные символы. [0–9a-fxA-FX] соответствует шестнадцатеричной цифре или букве X.

Якоря

Якоря - это другая порода. Они вообще не соответствуют ни одному персонажу. Вместо этого они соответствуют положению до, после или между символами. Их можно использовать для «привязки» совпадения регулярных выражений к определенной позиции. Символ вставки «^» соответствует началу строки, а «$» соответствует концу строки. Применение ^a к abc соответствует a. ^b вообще не соответствует abc, потому что b не может быть сопоставлено сразу после начала строки, совпадающей с ^.

Каретка может функционировать двумя способами; один должен соответствовать первой букве в строке

Второй предназначен для отрицания, когда он заключен в набор символов.

Точно так же $ совпадает сразу после последнего символа в строке. c$ соответствует c в abc, а a$ вообще не соответствует.

У большинства движков регулярных выражений есть «многострочный» режим, в котором ^ соответствует после любого разрыва строки, а $ — перед любым разрывом строки. Например. ^b соответствует только первому b в bob.

\b соответствует границе слова. Граница слова — это позиция между символом, с которым может сопоставляться \w, и символом, который не может совпадать с \w. \b также соответствует началу и/или концу строки, если первый и/или последний символы в строке являются символами слова. \B соответствует каждой позиции, где \b не может совпадать.

Чередование

Чередование — это эквивалент регулярного выражения «или». cat|dog соответствует cat в разделе «О кошках и собаках». Если регулярное выражение применяется снова, оно соответствует собаке. Вы можете добавить столько вариантов, сколько хотите: кошка|собака|мышь|рыба.

/cat|dog|/ matches a string that have cat or dog 
/a(rm|nt)/ mathces a string that have arm or ant 

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

Повторение

Знак вопроса делает предыдущий токен в регулярном выражении необязательным. colou?r соответствует цвету или цвету.

Звездочка или звездочка сообщают движку, что нужно попытаться сопоставить предыдущий токен ноль или более раз. Плюс сообщает движку, что нужно попытаться сопоставить предыдущий токен один или несколько раз. ‹[A-Za-z][A-Za-z0–9]*› соответствует тегу HTML без каких-либо атрибутов. ‹[A-Za-z0–9]+› легче написать, но он соответствует недопустимым тегам, таким как ‹1›.

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

Use
\b[1–9][0–9]{3}\b to match a number between 1000 and 9999.
\b[1–9][0–9]{2,4}\b matches a number between 100 and 99999.

Квантификаторы — ограничение повторения

Существует дополнительный квантификатор, который позволяет указать, сколько раз может повторяться токен. Используется следующий синтаксис: {min,max}, где min — ноль или положительное целое число, указывающее минимальное количество совпадений, а max — целое число, равное или превышающее min и указывающее максимальное количество совпадений. Если запятая присутствует, но max опущена, максимальное количество совпадений бесконечно. Таким образом, {0,1} совпадает с ?, {0,} совпадает с *, а {1,} совпадает с +. Отсутствие запятой и max означает, что движок повторяет токен ровно min раз.

Группировка и захват

Круглые скобки вокруг нескольких токенов помогают сгруппировать их вместе. Затем вы можете применить квантификатор к группе. Например. Установить (значение)? соответствует Set или SetValue.

(x)
Matches x and remembers the match. These are called capturing groups.
For example, /(foo)/ matches and remembers "foo" in "foo bar".
The capturing groups are numbered according to the order of left  parentheses of capturing groups, starting from 1. The matched substring  can be recalled from the resulting array's elements [1], ..., [n] or from the predefined RegExp object's properties $1, ..., $9.

Если вам не нужна группа для захвата совпадения, вы можете оптимизировать это регулярное выражение в Set(?:Value)?. Знак вопроса и двоеточие после открывающей скобки — это синтаксис, который создает группу без захвата. Вопросительный знак после открывающей скобки не связан с вопросительным знаком в конце регулярного выражения. Последний вопросительный знак — это квантификатор, делающий предыдущий токен необязательным. Этот квантификатор не может стоять после открывающей скобки, потому что в начале группы нет ничего, что можно было бы сделать необязательным.

Обзор

Lookaround — это особый вид группы. Токены внутри группы сопоставляются нормально, но затем механизм регулярных выражений заставляет группу отказаться от совпадения и сохраняет только результат. Lookaround соответствует позиции, как якоря. Он не расширяет соответствие регулярному выражению.

Lookahead и lookbehind, вместе называемые lookaround, являются утверждениями нулевой длины, такими же, как начало и конец строки и начало и конец слова. Разница в том, что поиск на самом деле соответствует символам, но затем отказывается от совпадения, возвращая только результат: совпадение или отсутствие совпадения. Вот почему они называются утверждениями.

q(?=u) соответствует рассматриваемому q, но не в Ираке. Это положительный прогноз. u не является частью общего совпадения регулярных выражений. Упреждающий поиск соответствует каждой позиции в строке перед буквой u.

q(?!u) соответствует q в Ираке, но не обсуждается. Это негативный прогноз. Токены внутри предпросмотра предпринимаются, их совпадение отбрасывается, а результат инвертируется.

Чтобы оглянуться назад, используйте lookbehind. (?‹=a)b соответствует b в abc. Это положительный взгляд назад. (?‹!a)b не соответствует abc.

Вы можете использовать полноценное регулярное выражение внутри просмотра вперед. Большинство приложений допускают только выражения фиксированной длины в ретроспективном просмотре.

Метод RegExp/Строковый метод

Регулярные выражения используются с методами RegExp test и exec, а также с методами String match, replace, search и split.

exec:метод RegExp, выполняющий поиск совпадений в строке. Он возвращает массив информации или ноль при несоответствии.

Тест: метод RegExp, который проверяет совпадение в строке. Возвращает истину или ложь.

Match: метод String, выполняющий поиск совпадения в строке. Он возвращает массив информации или ноль при несоответствии.

Поиск: метод String, который проверяет совпадение в строке. Он возвращает индекс совпадения или -1, если поиск не удался.

Replace: метод String, который выполняет поиск совпадения в строке и заменяет совпадающую подстроку замещающей подстрокой.

plit: метод String, использующий регулярное выражение или фиксированную строку для разбиения строки на массив подстрок.

Если вы хотите узнать, найден ли образец в строке, используйте метод проверки или поиска; для получения дополнительной информации (но более медленного выполнения) используйте методы exec или match. Если вы используете exec или match и если совпадение выполнено успешно, эти методы возвращают массив и обновляют свойства связанного объекта регулярного выражения, а также предопределенного объекта регулярного выражения RegExp. Если совпадение не удается, метод exec возвращает значение null (которое приводит к значению false).

Флаги

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

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

i С этим флагом поиск не зависит от регистра: нет различий. между A и a.

g С этим флагом поиск ищет все совпадения, без него — только первое (использование увидим в следующей главе).

m Многострочный режим (описан в главе Статья «regexp-multiline» не найден).

u Включает полную поддержку юникода. Флаг включает правильную обработку суррогатных пар. Подробнее об этом в главе Флаг юникода.

y Залипающий режим (рассматривается в следующей главе)

Чтобы включить флаг в регулярное выражение, используйте следующий синтаксис:

var re = /шаблон/флаги; или

var re = новое регулярное выражение («шаблон», «флаги»);

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

Флаг «i»

Самый простой флаг — i.

Пример с ним:

let str = «Я люблю JavaScript!»;

оповещение (str.search (/ЛЮБОВЬ/)); // -1 (не найдено)

оповещение(ул.поиск(/ЛЮБОВЬ/я)); // 2

  1. Первый поиск возвращает -1 (не найдено), поскольку поиск по умолчанию чувствителен к регистру.
  2. С флагом /LOVE/i поиск нашел любовь на позиции 2.

Флаг «g»

Пример с ним: re = /\w+\s/g создает регулярное выражение, которое ищет один или несколько символов, за которыми следует пробел, и ищет эту комбинацию по всей строке.

var re = /\w+\s/g;

var str = 'плата fi fo fum';

var myArray = str.match(re);

console.log(мой массив);

// ["плата", "fi", "fo"]

Флаг m используется для указания того, что многострочная входная строка должна рассматриваться как несколько строк. Если используется флаг m, ^ и $ совпадают в начале или конце любой строки во входной строке, а не в начале или конце всей строки.

Жадное и ленивое повторение

Операторы повторения или квантификаторы являются жадными. Они расширяют совпадение настолько, насколько могут, и возвращают только в том случае, если они должны удовлетворить оставшуюся часть регулярного выражения. Регулярное выражение ‹.+› соответствует ‹EM›first‹/EM› в Это тест ‹EM›first‹/EM›.

Поставьте вопросительный знак после квантификатора, чтобы сделать его ленивым. ‹.+?› соответствует ‹EM› в приведенной выше строке.

Этот шаблон ‹[^‹›]+› быстро сопоставляет тег HTML независимо от атрибутов. Класс отрицательных символов более специфичен, чем точка, что помогает механизму регулярных выражений быстро находить совпадения.

Вывод

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

Если вы не программист, вы также можете использовать регулярные выражения во многих ситуациях. Они значительно облегчают поиск информации. Вы можете использовать их в мощных операциях поиска и замены, чтобы быстро вносить изменения в большое количество файлов. Простой пример — gr[ae]y, который находит оба варианта написания слова grey за одну операцию, а не за две. Существует множество текстовых редакторов и инструментов поиска и замены с приличной поддержкой регулярных выражений.

Примечание:

Скобки нельзя использовать внутри классов символов, по крайней мере, в качестве метасимволов. Когда вы помещаете круглую скобку в класс символов, она рассматривается как буквальный символ. Таким образом, регулярное выражение [(a)b] соответствует a, b, ( и ).

Обратные ссылки также нельзя использовать внутри класса символов. \1 в регулярном выражении типа (a)[\1b] — это либо ошибка, либо литерал 1 без необходимости экранируется. В JavaScript это восьмеричный экран.