RegEX


Начало работы

Введение

Это краткая шпаргалка по началу работы с регулярными выражениями.

Классы символов

Шаблон Описание
[abc] Одиночный символ из: a, b или c
[^abc] Символ, за исключением: a, b или c
[a-z] Символ в диапазоне: a-z
[^a-z] Символ, не входящий в диапазон: a-z
[0-9] Цифра в диапазоне: 0-9
[a-zA-Z] Символ в диапазоне:a-z или A-Z
[a-zA-Z0-9] Символ в диапазоне: a-z, A-Z или 0-9

Квантификаторы

Шаблон Описание
a? Ноль или один из
a*
a+ Одно или более

|`[0-9]+`` | Одно или более из 0-9|

|a{3} | Ровно 3 из a| |a{3,} | 3 или более a| |a{3,6} | От 3 до 6 a|

|a* | Жадный квантификатор| |a*`` | Ленивый квантификатор| |a*+` | Possessive quantifier|

Общие метасимволы

  • ^
  • {
  • +
  • <
  • [
  • *
  • )
  • >
  • .
  • (
  • |
  • $
  • \
  • ? {.cols-3 .marker-none}

Экранируйте эти специальные символы с помощью \

Метапоследовательности

Pattern Description
. Любой одиночный символ
\s Любой пробельный символ
\S Любой символ, не являющийся пробельным
\d Любая цифра, такая же, как [0-9]
\D Любая нецифровая цифра, такая же, как [^0-9]
\w Любой символ слова
\W Любой несловарный символ
\X Любые последовательности Unicode, включая символы перевода строки
\C Соответствие одной единице данных
\R Новые строки Юникода
\v Вертикальный символ пробела
\V Отрицание \v - все, кроме новых строк и вертикальных табуляций
\h Горизонтальный символ пробельного символа
\H Отрицание \h
\K Сброс совпадения
\n Соответствие n-му подшаблону
\pX Свойство Юникода X
\p{...} Свойство Unicode или категория сценария
\PX Отрицание \pX
\P{...} Отрицание \p
\Q...\E Цитата; рассматривать как литерал
\k<name> Соответствие подшаблону name
\k'name' Искать подшаблон `name'
\k{name}
\gn
\g{n} Соответствие n-му подшаблону
\g<n> Перебор n-ой группы захвата
\g'n' Перебор n-й группы захватов.
\g{-n} Соответствие n-му относительному предыдущему подшаблону
\g<+n> Перебор n-го относительного последующего подшаблона
\g'+n'
\g'letter'
\g{letter}
\g<letter> Рекурсия именованной группы захвата letter
\xYY Шестнадцатеричный символ YY
\x{YYY} Шестнадцатеричный символ YYYY
\ddd Октальный символ ddd
\cY Управляющий символ Y
[\b]
\ Делает любой символ литералом

Якоря

Шаблон Описание
\G Начало совпадения
^ Начало строки
$
\A Начало строки
\Z Конец строки
\z Абсолютный конец строки
\b Граница слова
\B Граница неслова

Подстановка

Pattern Description
\0 Содержимое полного совпадения
\1 Содержимое в группе захвата 1
$1 Содержимое группы захвата 1
${foo} Содержимое группы захвата foo
\x20 Шестнадцатеричные значения замены
\x{06fa} Шестнадцатеричные значения замены
\t Табуляция
\r Возврат каретки
\n Новая строка
\f Form-feed
\U Преобразование прописных букв
\L Преобразование нижнего регистра
\E Прервать любое преобразование

Групповые конструкции

Pattern Description
(...) Захватывать все, что заключено
`(a b)`
(?:...) Искать все, что вложено
(?>...) Атомарная группа (не захватывающая)
`(?
(?#...) Комментарий

|(?'name'...) | Именованная группа захвата| |(?<name>...) | Named Capturing Group| |(?P<имя>...) | Именованная группа захвата|

|(?imsxXU) | Встроенные модификаторы| |(?(DEFINE)...) | Предварительное определение шаблонов перед их использованием|

Утверждения

- -
`(?(1)да нет)`
`(?(R)yes no)`
`(?(R#)yes no)`
`(?(R&name)yes no)`
`(?(?=…)yes no)`
`(?(?<=…)yes no)`

Lookarounds

- -
(?=...) Positive Lookahead
(?!...) Отрицательный заголовок
(?<=...)
(?<!...)
Lookaround позволяет сопоставить группу до (lookbehind) или после (lookahead) основного шаблона, не включая ее в результат.

Флаги/модификаторы

Шаблон Описание
g Глобальный
m Многострочный
i Нечувствительный к регистру
x Игнорировать пробельные символы
S Однострочный
u Юникод
X eXtended
U Неграмотный
A Якорь
J Дублирование имен групп

Recurse

- -
(?R) Вывод всего образца
(?1) Вывод первого подшаблона
(?+1) Вывод первого относительного подшаблона
(?&name)
(?P=name)
(?P>name)

Классы символов POSIX

Класс символов То же, что Значение
[[:alnum:]] [0-9A-Za-z] Буквы и цифры
[[:alpha:]] [A-Za-z] Буквы
[[:ascii:]] [\x00-\x7F] ASCII-коды 0-127
[[:blank:]] [\t ]
[[:cntrl:]] [\x00-\x1F\x7F]
[[:digit:]] [0-9]
[[:graph:]] [[:alnum:][:punct:]]
[[:lower:]] [a-z]
[[:print:]] [ -~] == [:graph:]]
[[:punct:]] [!"#$%&’()*+,-./:;<=>?@[]^_`{|}~]
[[:пробел:]] [\t\n\v\f\r ] Пробел
[[:upper:]] [A-Z]
[[:word:]] [0-9A-Za-z_]
[[:xdigit:]] [0-9A-Fa-f] Шестнадцатеричные цифры
[[:<:]] [\b(?=\w)]
[[:>:]] [\b(?<=\w)]
{.show-header}

Управляющий глагол

- -
(*ACCEPT) Глагол управления
(*FAIL) Управляющий глагол
(*MARK:NAME) Глагол управления
(*COMMIT) Глагол управления
(*PRUNE) Глагол управления
(*SKIP) Управляющий глагол
(*THEN) Управляющий глагол
(*UTF) Модификатор шаблона
(*UTF8) Модификатор шаблона
(*UTF16) Модификатор шаблона
(*UTF32)
(*UCP)
(*CR)
(*LF) Модификатор переноса строки
(*CRLF) Модификатор переноса строки
(*ANYCRLF) Модификатор переноса строки
(*ANY)
\R Модификатор перевода строки
(*BSR_ANYCRLF) Модификатор переноса строки
(*BSR_UNICODE) Модификатор перевода строки
(*LIMIT_MATCH=x) Модификатор регекса
(*LIMIT_RECURSION=d) Модификатор регекса
(*NO_AUTO_POSSESS)
(*NO_START_OPT) Модификатор Regex-движка

Примеры Regex

Characters

Pattern Matches
ring Match ring springboard etc.
. Искать a, 9, + и т.д.
h.o
ring\? Искать кольцо?
\(тихий\) Соответствие (тихий)
c:\\windows Искать c:\windows

Используйте \ для поиска этих специальных символов: [ \ ^ $ . | ? * + ( ) { }

Альтернативы

Pattern Matches
`cat dog`
`id identity`
`identity

Упорядочивание от более длинного к более короткому, когда альтернативы пересекаются

Классы символов

Pattern Matches
[aeiou] Искать любую гласную
[^aeiou] Соответствует НЕ гласной
r[iau]ng Соответствует ring, wrangle, sprung и т.д.
gr[ae]y Искать gray или grey
[a-zA-Z0-9]
[\u3a00-\ufa99] Искать любую Unicode Hàn (中文)

В [ ] всегда экранируется . \ ] и иногда ^ - .

Классы сокращений

Pattern Meaning
\w “Слово” символ (буква, цифра или знак подчеркивания)
\d Цифра
\s
\W, \D или \S Не слово, не цифра и не пробел
[\D\S] Означает не цифру и не пробел, оба совпадают
[^\d\s] Запретить цифру и пробел

Occurrences

Pattern Matches
colou?r Искать color или colour
[BW]ill[ieamy's]* Искать Bill, Willy, William’s и т.д.
[a-zA-Z]+ Искать 1 или более букв
\d{3}-\d{2}-\d{4} Соответствие SSN
[a-z]\w{1,7} Соответствие идентификатору UW NetID

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

Шаблон Значение
* + {n,}greedy Искать как можно больше совпадений
<.+> Находит 1 большое совпадение в <b>bold</b>
*? +? {n,}?lazy Находит как можно меньше совпадений
<.+?> Находит 2 совпадения в <b>bold</b>

Область

Pattern Meaning
\b Край “слова” (рядом с символом, не являющимся “словом”)
\bring Слово начинается с “ring”, например ringtone
\b9\b Слово заканчивается на “ring”, например spring
\b9\b
\b[a-zA-Z]{6}\b Искать слова из 6 букв
\B
\Bring\B
^\d*$ Вся строка должна состоять из цифр
^[a-zA-Z]{4,20}$ Строка должна содержать 4-20 букв
^[A-Z] Строка должна начинаться с заглавной буквы
[\.!?"')]$ Строка должна заканчиваться терминальной пунктуацией

Модификаторы

Шаблон Значение
(?i)[a-z]*(?-i) Игнорировать регистр ON / OFF
(?s).*(?-s) Соответствие нескольким строкам (заставляет . соответствовать новой строке)
(?m)^.*;$(?-m)
(?x)
(?-x)
/regex/ismx Изменить режим для всей строки

Группы

Pattern Meaning
(in|out)put Соответствие входу или выходу
\d{5}(-\d{4})? Почтовый индекс США ("+ 4" необязательно)
Парсер пробует КАЖДУЮ альтернативу, если совпадение не удалось после группы.
Это может привести к катастрофическому откату назад.

Обратные ссылки

Pattern Matches
(to) (be) or not \1 \2 Соответствие to be or not to be
([^\s])\1{2} Искать без пробела, затем то же самое еще два раза   aaa,
\b(\w+)\s+\1\b Искать удвоенные слова

Группа не захвата

Образец Значение
on(?:click|load) Быстрее, чем: on(click|load)

По возможности используйте незахватывающие или атомарные группы

Атомарные группы

Шаблон Значение
(?>red|green|blue)\b Быстрее, чем без захвата
(?>id|identity)\b Совпадает с id, но не с identity

“id” совпадает, но \b не работает после атомарной группы, синтаксический анализатор не возвращается в группу для повторной попытки определения ‘identity’ Если альтернативы пересекаются, упорядочиваем более длинные к более коротким.

Lookaround

Pattern Meaning
(?= ) Lookahead, если вы можете найти впереди
(?! ) Lookahead, если вы не можете найти впереди
(?<= ) Lookbehind, если вы можете найти позади
(?<! ) Lookbehind, если вы НЕ можете найти позади
\b\w+?(?=ing\b) Match warbling, string, fishing, …
\b(?!\w+ing\b)\w+\b Слова, не оканчивающиеся на “ing”
(?<=\bpre).*?\b Искать pretend, present, prefix, …
\b\w{3}(?<!pre)\w*?\b Слова, НЕ начинающиеся с “pre”
\b\w+(?<!ing)\b Искать слова, не заканчивающиеся на “ing”

If-then-else

Искать “Mr.” или “Ms.”, если слово “her” находится позже в строке

M(?(?=.*?\bher\b)s|r)\.

требует поиска для условия IF

RegEx в Python

Начало работы

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

``python import re



### Примеры {.col-span-2 .row-span-3}

#### re.search()
``python
>>> sentence = 'Это пример строки'
>>> bool(re.search(r'this', sentence, flags=re.I))
True
>>> bool(re.search(r'xyz', sentence))
False

re.findall()

``python

re.findall(r’\bs?pare?\b’, ‘par spar apparent spare part pare’) [‘par’, ‘spar’, ‘spare’, ‘pare’] re.findall(r’\b0*[1-9]\d{2,}\b’, ‘0501 035 154 12 26 98234’) [‘0501’, ‘154’, ‘98234’]



#### re.finditer()
``python
>>> m_iter = re.finditer(r'[0-9]+', '45 349 651 593 4 204')
>>> [m[0] for m in m_iter if int(m[0]) < 350]
['45', '349', '4', '204']

re.split()

``python

re.split(r’\d+’, ‘Sample123string42with777numbers’) [‘Sample’, ‘string’, ‘with’, ’numbers’]



#### re.sub()
``python
>>> ip_lines = "catapults\nconcatenate\ncat"
>>> print(re.sub(r'^', r'* ', ip_lines, flags=re.M))
* catapults
* конкатенат
* cat

re.compile()

``python

pet = re.compile(r’dog’) type(pet) <class ‘_sre.SRE_Pattern’> bool(pet.search(‘Они купили собаку’)) True bool(pet.search(‘Им дорогу перешла кошка’)) False


### Функции

| Функция | Описание |
|---------------|-------------------------------------------------------------------|
| `re.findall` | Возвращает список, содержащий все совпадения |
| | `re.finditer` | Возвращает итерабель объектов match (по одному на каждое совпадение) |
| | `re.search` | Возвращает объект Match, если в строке есть совпадение |
| `re.split` | Возвращает список, в котором строка была разделена на каждое совпадение |
| `re.sub` | Заменяет одно или несколько совпадений строкой |
| | `re.compile` | Компиляция шаблона регулярного выражения для последующего использования |
| `re.escape` | Возвращает строку, в которой все неалфавитно-цифровые символы отделены обратной косой чертой |



### Флаги


| - | - | - |
|--------|-----------------|----------------------------------------------|
| `re.I` | `re.IGNORECASE` | Игнорировать регистр |
| `re.M` | `re.MULTILINE` | Многострочный |
| `re.L` | `re.LOCALE` | Сделать `\w`,`\b`,`\s` _локально зависимыми_ |
| `re.S` | `re.DOTALL` | Точка совпадает со всеми _(включая новую строку)_ |
| | `re.U` | `re.UNICODE` | Сделать `\w`,`\b`,`\d`,`\s` _юникод-зависимыми_ |
| | `re.X` | `re.VERBOSE` | Стиль для чтения |



Regex в JavaScript
---------------

### test()
``javascript
let textA = 'Мне очень нравятся яблоки';
let textB = 'Мне нравятся яблоки';
let regex = /apples$/i
 
// Выход: false
console.log(regex.test(textA));
 
// Вывод: true
console.log(regex.test(textB));
let text = 'Мне очень нравятся яблоки';
let regexA = /apples/;
let regexB = /apples/i;
 
// Выходные данные: -1
console.log(text.search(regexA));
 
// Вывод: 7
console.log(text.search(regexB));

exec()

``javascript let text = ‘Вы любите яблоки?’; let regex = /apples/;

// Выходные данные: яблоки console.log(regex.exec(text)[0]);

// Вывод: Вы любите яблоки? console.log(regex.exec(text).input);



### match()

``javascript
let text = 'Здесь яблоки и апплС';
let regex = /apples/gi;
 
// Вывод: ["apples", "apPleS" ].
console.log(text.match(regex));

split()

``javascript let text = ‘Эта 593 строка будет бро294ена в местах, где есть d1gits.’; let regex = /\d+/g

// Вывод: [“Эта “, " строка будет брошена”, “en в местах, где есть d”, “gits” ]. console.log(text.split(regex))




### matchAll()

``javascript
let regex = /t(e)(st(\d?))/g;
let text = 'test1test2';
let array = [...text.matchAll(regex)];

// Выходные данные: ["test1", "e", "st1", "1"]
console.log(array[0]);

// Выходные данные: ["test2", "e", "st2", "2"]
console.log(array[1]);

replace()

``javascript {.wrap} let text = ‘Любите ли вы яблоки?’; let regex = /apples/i

// Вывод: Do you like mangoes? let result = text.replace(regex, ‘mangoes’); console.log(result);



### replaceAll()

```javascript
let regex = /apples/gi;
let text = 'Здесь яблоки и апплС';

// Вывод: Здесь манго и манго
let result = text.replaceAll(regex, "mangoes");
console.log(result);

Регекс в PHP

Функции

- -
preg_match() Выполняет совпадение регулярных выражений
preg_match_all() Выполняет глобальное совпадение регулярных выражений
preg_replace_callback() Выполнить поиск и замену регулярного выражения с помощью обратного вызова
preg_replace() Выполнить поиск и замену регулярного выражения
preg_split() Разделяет строку по шаблону regex
preg_grep() Возвращает записи массива, соответствующие шаблону

preg_replace

``php {.wrap} $str = “Посетите Microsoft!”; $regex = “/microsoft/i”;

// Вывод: Посетите CheatSheets! echo preg_replace($regex, “CheatSheets”, $str);




### preg_match
```php
$str = "Посетите CheatSheets";
$regex = "#cheatsheets#i";

// Вывод: 1
echo preg_match($regex, $str);

preg_matchall

$regex = "/[a-zA-Z]+ (\d+)/";
$input_str = "24 июня, 13 августа и 30 декабря";
if (preg_match_all($regex, $input_str, $matches_out)) {

    // Выход: 2
    echo count($matches_out);

    // Вывод: 3
    echo count($matches_out[0]);

    // Выходные данные: Array("24 июня", "13 августа", "30 декабря")
    print_r($matches_out[0]);

    // Выходные данные: Array("24", "13", "30")
    print_r($matches_out[1]);
}

preg_grep

``php $arr = [“Jane”, “jane”, “Joan”, “JANE”]; $regex = “/Jane/”;

// Вывод: Джейн echo preg_grep($regex, $arr);



### preg_split {.col-span-2}
``php
$str = "Jane\tKate\nLucy Marion";
$regex = "@\s@";

// Выходные данные: Array("Jane", "Kate", "Lucy", "Marion")
print_r(preg_split($regex, $str));

Регекс в Java

Стили

Первый способ

``java Pattern p = Pattern.compile(".s”, Pattern.CASE_INSENSITIVE); Matcher m = p.matcher(“aS”); boolean s1 = m.matches(); System.out.println(s1); // Выходные данные: true


#### Второй способ
``java
boolean s2 = Pattern.compile("[0-9]+").matcher("123").matches();
System.out.println(s2); // Вывод: true

Третий способ

``java boolean s3 = Pattern.matches(".s", “XXXX”); System.out.println(s3); // Вывод: false



### Поля шаблона


| - | - |
|--------------------|---------------------------------|
| `CANON_EQ` | Каноническая эквивалентность |
| `CASE_INSENSITIVE` | Сопоставление без учета регистра |
| `COMMENTS` | Разрешает пробельные символы и комментарии |
| `DOTALL` | Точечный режим |
| `MULTILINE` | Многострочный режим |
| `UNICODE_CASE` | Свертывание регистра с учетом юникода |
| `UNIX_LINES` | Режим строк Unix |





### Методы

#### Pattern
- Pattern compile(String regex [, int flags])
- boolean matches([String regex, ] CharSequence input)
- String[] split(String regex [, int limit])
- String quote(String s)

#### Matcher
- int start([int group | String name])
- int end([int group | String name])
- boolean find([int start])
- String group([int group | String name])
- Matcher reset()

#### String

- boolean matches(String regex)
- String replaceAll(String regex, String replacement)
- String[] split(String regex[, int limit])

Есть и другие методы ...




### Примеры {.col-span-2}

Замените предложение:
``java
String regex = "[A-Z\n]{5}$";
String str = "Мне нравится APP\nLE";

Pattern p = Pattern.compile(regex, Pattern.MULTILINE);
Matcher m = p.matcher(str);

// Выходные данные: Мне нравится Apple!
System.out.println(m.replaceAll("pple!"));

Массив всех совпадений: ``java String str = “Она продает ракушки на берегу моря”; String regex = “\wse\\w”;

Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE); Matcher m = p.matcher(str);

List matches = new ArrayList<>(); while (m.find()) { matches.add(m.group()); }

// Выходные данные: [sells, seashells, Seashore]. System.out.println(matches);



Regex в MySQL {.cols-2}
-------------

### Функции
| Имя | Описание |
|--------------------|--------------------------------------------------------------------------|
| `REGEXP` | Совпадает ли строка с regex |
| `REGEXP_INSTR() ` | Начальный индекс подстроки, соответствующей regex <br>_(NOTE: Только MySQL 8.0+)_ |
| `REGEXP_LIKE() ` | Совпадает ли строка с regex <br>_(ПРИМЕЧАНИЕ: Только MySQL 8.0+)_ |
| `REGEXP_REPLACE()` | Замена подстрок, соответствующих regex <br>_(ПРИМЕЧАНИЕ: Только MySQL 8.0+)_ |
| `REGEXP_SUBSTR()` | Вернуть подстроку, соответствующую regex <br>_(ПРИМЕЧАНИЕ: Только MySQL 8.0+)_ |



### REGEXP
```sql {.wrap}
expr REGEXP pat

Примеры

mysql> SELECT 'abc' REGEXP '^[a-d]';
1
mysql> SELECT name FROM cities WHERE name REGEXP '^A';
mysql> SELECT name FROM cities WHERE name NOT REGEXP '^A';
mysql> SELECT name FROM cities WHERE name REGEXP 'A|B|R';
mysql> SELECT 'a' REGEXP 'A', 'a' REGEXP BINARY 'A';
1 0

REGEXP_REPLACE

REGEXP_REPLACE(expr, pat, repl[, pos[, occurrence[, match_type]]])

Примеры

mysql> SELECT REGEXP_REPLACE('a b c', 'b', 'X');
a X c
mysql> SELECT REGEXP_REPLACE('abc ghi', '[a-z]+', 'X', 1, 2);
abc X

REGEXP_SUBSTR

REGEXP_SUBSTR(expr, pat[, pos[, occurrence[, match_type]]])

Примеры

mysql> SELECT REGEXP_SUBSTR('abc def ghi', '[a-z]+');
abc
mysql> SELECT REGEXP_SUBSTR('abc def ghi', '[a-z]+', 1, 3);
ghi

REGEXP_LIKE

REGEXP_LIKE(expr, pat[, match_type])

Примеры

mysql> SELECT regexp_like('aba', 'b+')
1
mysql> SELECT regexp_like('aba', 'b{2}')
0
mysql> # i: нечувствительно к регистру
mysql> SELECT regexp_like('Abba', 'ABBA', 'i');
1
mysql> # m: многострочный
mysql> SELECT regexp_like('a\nb\nc', '^b$', 'm');
1

REGEXP_INSTR

REGEXP_INSTR(expr, pat[, pos[, occurrence[, return_option[, match_type]]]])

Примеры

mysql> SELECT regexp_instr('aa aaa aaaa', 'a{3}');
2
mysql> SELECT regexp_instr('abba', 'b{2}', 2);
2
mysql> SELECT regexp_instr('abbabba', 'b{2}', 1, 2);
5
mysql> SELECT regexp_instr('abbabba', 'b{2}', 1, 3, 1);
7