Регулярные выражения - это способ описания шаблонов в строковых данных. Они образуют небольшой отдельный язык, являющийся частью JavaScript и многих других языков и систем. Они являются мощным инструментом для проверки и обработки строк. Правильное понимание регулярных выражений сделает вас более эффективным программистом.
Создание регулярного выражения
Регулярное выражение JavaScript (или Regex ) - это последовательность символов, которую мы можем использовать для эффективной работы со строками. Используя этот синтаксис, мы можем:
- искать текст в строке
- заменить подстроки в строке
- извлекать информацию из строки
Регулярное выражение - это тип объекта. В JavaScript мы можем создать регулярное выражение двумя способами: либо с помощью конструктора RegExp, либо с помощью литерального синтаксиса.
Литеральный синтаксис использует косую черту ( /pattern/) для обертывания шаблона регулярного выражения, тогда как синтаксис конструктора использует кавычки ( "pattern"). В следующем примере демонстрируются оба способа создания регулярного выражения, которое соответствует любой строке, начинающейся с «Mr.».
В приведенном выше примере строка Mr. соответствует шаблону RegExp("^Mr\\."). Здесь для проверки соответствия строки шаблону используется метод test().
Есть несколько других методов, доступных для использования с JavaScript RegEx. Прежде чем мы их изучим, давайте узнаем о самих регулярных выражениях.
Примечание: При использовании синтаксиса конструктора необходимо дважды экранировать специальные символы, что означает соответствие "." вам нужно писать "\\."вместо "\.". Если есть только одна обратная косая черта, она будет интерпретирована парсером строк JavaScript как экранирующий символ и будет удалена.
К специальным символам регулярного выражения относятся: .
*
?
+
[
]
(
)
{
}
^
$
|
\
. Вам нужно будет использовать обратную косую черту для этих символов всякий раз, когда вы захотите использовать их буквально. Например, если вы хотите сопоставить «?», Вам нужно будет написать \?
. Все остальные символы автоматически принимают их буквальные значения.
МетаСимволы
Для указания регулярных выражений используются метасимволы. В приведенном выше примере ( /^Mr\./
) ^
является метасимволом.
Метасимволы - это символы, которые интерпретируются особым образом механизмом RegEx. Вот список метасимволов:
[]. ^ $ * +? {} () \ |
[]
- Квадратные скобки
Квадратные скобки указывают набор символов, которые вы хотите сопоставить.
Выражение | Строка | Совпадения |
---|---|---|
[abc] |
a |
1 совпадение |
ac |
2 совпадения | |
Hey Jude |
Не совпадает | |
abc de ca |
5 совпадений |
Здесь [abc]
будет соответствовать, если строка, которую вы пытаетесь сопоставить, содержит любой из символов a
, b
или c
.
Вы также можете указать диапазон символов, используя дефис -
в квадратных скобках.
[a-e]
то же самое, что и [abcde]
.
[1-4]
то же самое, что и [1234]
.
[0-39]
то же самое, что и [01239]
.
Вы можете дополСтрока (инвертировать) набор символов, используя символ вставки ^
в начале квадратной скобки.
[^abc]
означает любой символ, кроме a
или b
или c
.
[^0-9]
означает любой нецифровой символ.
.
- Точка
Точка соответствует любому одиночному символу (кроме новой строки '\n'
).
Выражение | Строка | Совпадения |
---|---|---|
.. |
a |
Не совпадает |
ac |
1 совпадение | |
acd |
1 совпадение | |
acde |
2 совпадения (содержит 4 символа) |
^
- Каретка
Символ каретки ^
используется для проверки того, начинается ли строка с определенного символа.
Выражение | Строка | Совпадения |
---|---|---|
^a |
a |
1 совпадение |
abc |
1 совпадение | |
bac |
Не совпадает | |
^ab |
abc |
1 совпадение |
acb |
Нет совпадений (начинается с a , но не сопровождается b ) |
$
- доллар
Символ доллара $
используется для проверки того, заканчивается ли строка определенным символом.
Выражение | Строка | Совпадения |
---|---|---|
a$ |
a |
1 совпадение |
formula |
1 совпадение | |
cab |
Не совпадает |
*
- Звездочка
Символ звездочки *
соответствует предыдущему символу повторенному 0 или более раз. Эквивалентно {0,}.
Выражение | Строка | Совпадения |
---|---|---|
ma*n |
mn |
1 совпадение |
man |
1 совпадение | |
mann |
1 совпадение | |
main |
Нет совпадений ( a не следует n ) |
|
woman |
1 совпадение |
+
- Плюс
Символ плюс +
соответствует предыдущему символу повторенному 1 или более раз. Эквивалентно {1,}.
Выражение | Строка | Совпадения |
---|---|---|
ma+n |
mn |
Нет совпадений (нет a символа) |
man |
1 совпадение | |
mann |
1 совпадение | |
main |
Нет совпадений ( a не следует n ) |
|
woman |
1 совпадение |
?
- Вопросительный знак
Знак вопроса ?
соответствует нулю или одному вхождению предыдущего символа. То же самое, что и {0,1}. По сути, делает символ необязательным.
Выражение | Строка | Совпадения |
---|---|---|
ma?n |
mn |
1 совпадение (0 вхождений а) |
man |
1 совпадение | |
mann |
Нет совпадений (более одного n символа) |
|
main |
Нет совпадений ( a не следует n ) |
|
woman |
1 совпадение |
{}
- Фигурные скобки
Рассмотрим следующий код: {n,m}
. Это означает, по крайней мере n
, и не больше m
повторений предыдущего символа. При m=n=1 пропускается..
Выражение | Строка | Совпадения |
---|---|---|
a{2,3} |
abc dat |
Не совпадает |
abc daat |
1 совпадение (в )daat |
|
aabc daaat |
2 совпадения (при aabc и )daaat |
|
aabc daaaat |
2 совпадения (при aabc и )daaaat |
Посмотрим еще один пример. Это RegEx [0-9]{2, 4}
соответствует как минимум 2 цифрам, но не более 4-х цифр.
Выражение | Строка | Совпадения |
---|---|---|
[0-9]{2,4} |
ab123csde |
1 совпадение (совпадение в )ab123csde |
12 и 345673 |
3 совпадения ( 12 , 3456 , 73 ) |
|
1 и 2 |
Не совпадает |
|
- Альтернация (или)
Альтернация (вертикальная черта) |
– термин в регулярных выражениях, которому в русском языке соответствует слово «ИЛИ». (оператор or
).
Например: gr(a|e)y означает точно то же, что и gr[ae]y.
Выражение | Строка | Совпадения |
---|---|---|
a|b |
cde |
Не совпадает |
ade |
1 совпадение (совпадение в ade ) |
|
acdbea |
3 совпадения (в )acdbea |
Здесь a|b
сопоставьте любую строку, содержащую либо, a
либоb
Чтобы примеСтрока альтернацию только к части шаблона, можно заключить её в скобки:
Учу HTML|CSS
найдётУчу HTML
илиCSS
.Учу (HTML|CSS)
найдётУчу HTML
илиУчу CSS
.
()
- Скобочные группы
Круглые скобки ()
используются для группировки подшаблонов. Так, например, (a|b|c)xz
соответствует любой строке, которая соответствует либо a
или b
или c
с последующимxz
Выражение | Строка | Совпадения |
---|---|---|
(a|b|c)xz |
ab xz |
Не совпадает |
abxz |
1 совпадение (совпадение в )abxz |
|
axz cabxz |
2 совпадения (в )axzbc cabxz |
\
- обратная косая черта
Обратная косая черта \
используется для экранирования различных символов, включая все метасимволы. Например,
\$a
соответствует, если строка содержит $
, за которым следует a
. Здесь $
механизм RegEx не интерпретирует особым образом.
Если вы не уверены, имеет ли символ особое значение или нет, вы можете экранировать его косой чертой \
. Это гарантирует, что экранированный символ не будет компилироваться по-особенному.
Специальные последовательности
Специальные последовательности упрощают написание часто используемых шаблонов. Вот список специальных последовательностей:
\A
- Соответствует, если указанные символы находятся в начале строки.
Выражение | Строка | Совпадения |
---|---|---|
\Athe |
the sun |
Совпадает |
In the sun |
Не совпадает |
\b
- Соответствует, если указанные символы находятся в начале или в конце слова.
Выражение | Строка | Совпадения |
---|---|---|
\bfoo |
football |
Совпадает |
a football |
Совпадает | |
foo\b |
a football |
Не совпадает |
the foo |
Совпадает | |
the afoo test |
Совпадает | |
the afootest |
Не совпадает |
\B
- противоположность \b
. Соответствует, если указанные символы НЕ находятся в начале или конце слова.
Выражение | Строка | Совпадения |
---|---|---|
\Bfoo |
football |
Не совпадает |
a football |
Не совпадает | |
foo\B |
a football |
Совпадает |
the foo |
Не совпадает | |
the afoo test |
Не совпадает | |
the afootest |
Совпадает |
\d
- Соответствует любой десятичной цифре. Эквивалентно[0-9]
Выражение | Строка | Совпадения |
---|---|---|
\d |
12abc3 |
3 совпадения (в )12abc3 |
JavaScript |
Не совпадает |
\D
- Соответствует любой не десятичной цифре. Эквивалентно[^0-9]
Выражение | Строка | Совпадения |
---|---|---|
\D |
1ab34"50 |
3 совпадения (в )1ab34"50 |
1345 |
Не совпадает |
\s
- Соответствует строкам, содержащим любой пробельный символ. Эквивалентно [ \t\n\r\f\v]
.
Выражение | Строка | Совпадения |
---|---|---|
\s |
JavaScript RegEx |
1 Совпадает |
JavaScriptRegEx |
Не совпадает |
\S
- Соответствует строкам, содержащим любой непробельный символ. Эквивалентно [^ \t\n\r\f\v]
.
Выражение | Строка | Совпадения |
---|---|---|
\S |
a b |
2 совпадения (в a b ) |
Не совпадает |
\w
- Соответствует любому буквенно-цифровому символу (цифрам и алфавитам). Эквивалентно [a-zA-Z0-9_]
. Кстати, подчеркивание _
тоже считается буквенно-цифровым символом.
Выражение | Строка | Совпадения |
---|---|---|
\w |
12&": ;c |
3 совпадения (в )12&": ;c |
%"> ! |
Не совпадает |
\W
- Соответствует любому не буквенно-цифровому символу. Эквивалентно[^a-zA-Z0-9_]
Выражение | Строка | Совпадения |
---|---|---|
\W |
1a2%c |
1 Совпадает (в )1a2%c |
JavaScript |
Не совпадает |
\Z
- Соответствует, если указанные символы находятся в конце строки.
Выражение | Строка | Совпадения |
---|---|---|
JavaScript\Z |
I like JavaScript |
1 Совпадает |
I like JavaScript Programming |
Не совпадает | |
JavaScript is fun |
Не совпадает |
Теперь вы понимаете основы регаулярных выражений, давайте обсудим, как использовать регулярные выражения в вашем коде JavaScript.
Методы регулярных выражений JavaScript
Как упоминалось выше, вы можете использовать конструктор RegExp()
и литерал регулярного выражения для создания регаулярных выражений в JavaScript.
const regex1 = /^ab/;
const regex2 = new Regexp('/^ab/');
В JavaScript вы можете использовать регулярные выражения RegExp()
с методами: test()
и exec()
.
Есть также некоторые строковые методы, которые позволяют передавать RegEx в качестве параметра. К ним относятся match()
, replace()
, search()
и split()
.
Метод | Описание |
---|---|
exec() |
Выполняет поиск совпадения в строке и возвращает массив информации. При несоответствии возвращает null. |
test() |
Проверяет совпадение в строке и возвращает true или false. |
match() |
Возвращает массив, содержащий все совпадения. При несоответствии возвращает null. |
matchAll() |
Возвращает итератор, содержащий все совпадения. |
search() |
Проверяет совпадение в строке и возвращает индекс совпадения. Он возвращает -1, если поиск не удался. |
replace() |
Ищет совпадение в строке и заменяет совпавшую подстроку замещающей подстрокой. |
split() |
Разбивает строку на массив подстрок. |
Пример 1: регулярные выражения
Флаги регулярных выражений
Регулярные выражения имеют четыре опциональных флага, которые делают возможным глобальный и регистронезависимый поиск. Флаги могут использоваться самостоятельно или вместе в любом порядке, а также могут являться частью регулярного выражения.
Флаги | Описание |
---|---|
g |
Глобальный поиск (найти все совпадения) |
m |
Многострочный поиск. |
i |
Регистронезависимый поиск. |
y |
Выполняет поиск начиная с символа, который находится на позиции свойства lastindex текущего регулярного выражения. |
Чтобы использовать флаги в шаблоне регулярного выражения используйте следующий синтаксис:
var re = /pattern/flags;
или
var re = new RegExp("pattern", "flags");
Пример 2: Модификатор регулярного выражения
Пример 3: Проверка номера телефона
Пример 4: Проверка адреса электронной почты
Практика регулярных выражений
Давайте попрактикуемся в некоторых концепциях, которые мы узнали выше.
Составьте выражение, которое соответствует любому 10-значному числу:
Давайте разберемся с этим и посмотрим, что там происходит.
- Если мы хотим добиться, чтобы совпадение охватывало всю строку, мы можем добавить квантификаторы
^
и$
. Каретка^
соответствует началу входной строки, а знак доллара$
соответствует ее концу. Таким образом, шаблон не будет соответствовать, если строка содержит более 10 цифр. \d
соответствует любому цифровому символу.{10}
совпадает с предыдущим выражением, в данном случае\d
ровно 10 раз. Таким образом, если тестовая строка содержит менее или более 10 цифр, результат будет ложным.
Сопоставьте дату со следующим форматом DD-MM-YYYY или DD-MM-YY
Давайте разберемся с этим и посмотрим, что там происходит.
- Опять же, мы обернули все регулярное выражение внутрь
^
и$
, так что совпадение охватывает всю строку. (
начало первого подвыражения.\d{1,2}
соответствует минимум 1 цифре и максимум 2 цифрам.-
соответствует буквальному дефису.)
конец первого подвыражения.{2}
соответствовать первому подвыражению ровно два раза.\d{2}
соответствует ровно двум цифрам.(\d{2})?
соответствует ровно двум цифрам. Но это необязательно (знак ?), поэтому год состоит из 2 или 4 цифр.
Выражение, которое соответствует чему угодно, кроме новой строки
Выражение должно соответствовать любой строке с форматом, например abc.def.ghi.jkl
, где каждая переменная a, b, c, d, e, f, g, h, i, j, k, l
может быть любым символом, кроме новой строки.
Давайте разберемся с этим и посмотрим, что там происходит.
- Мы обернули все регулярное выражение внутрь
^
и$
, так что совпадение охватывает всю строку. (
начало первого подвыражения.{3}
соответствует любому символу, кроме новой строки, ровно 3 раза.\.
соответствует буквальной.
точке)
конец первого подвыражения{3}
соответствует первому подвыражению ровно 3 раза..{3}
соответствует любому символу, кроме новой строки, ровно 3 раза.
Комментарии
<code>
, несколько строчек кода — в теги<pre><code>
...ваш код...</code></pre>
.