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

Что такое регулярные выражения?

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

В первую очередь стоит заметить, что любая строка сама по себе является регулярным выражением. Так, выражению „Хаха“, очевидно, будет соответствовать строка „Хаха“ и только она. Регулярки являются регистрозависимыми, поэтому строка „хаха“ (с маленькой буквы) уже не будет соответствовать выражению выше.

Однако уже здесь следует быть аккуратным — как и любой язык, регекспы имеют спецсимволы, которые нужно экранировать. Вот их список: . ^ $ * + ? { } [ ] \ | ( ). Экранирование осуществляется обычным способом — добавлением перед спецсимволом. В Staffcop можно посмотреть описание данных спецсимволов и попробовать создать свое выражение в конструкторе регулярных выражений. Например, можете создать политику поиск словарю и там будет возможность перейти в конструктор.

Важно: Спецсимвол \b по разному отрабатывает в postgresql, clickhouse.
  1. В postgresql она подменятеся на \y которое срабатывает на начало и конец слова, в том числе после спецсимвола, в том числе с юникодом

  2. В clickhouse юникод не поддерживатся, начало слова считается только после пробела/табуляции/начала строки

../_images/regexp.png

Если вам требуется больше спецсимволов, то можете использовать сайт для создания выражений https://regex101.com/

Кейсы по регулярным выражениям

Поиск e-mail в тексте или логина AD

~~*(\s|^|\n|\b)(\w|\.?|\-?)+@([A-zА-я0-9][-A-zА-я0-9]+\.)+[A-zА-я]{2,13}((\s|$|\n|\b))

Номерные знаки машин, расширенные и короткие

~~*(А|В|Е|К|М|Н|О|Р|С|Т|У|Х)(\s|\-)?\d{3}(А|В|Е|К|М|Н|О|Р|С|Т|У|Х){2}(\s|\-)?\d{2,3}
~~*(A|B|E|K|M|H|O|P|C|T|Y|X)(\s|\-)?\d{3}(A|B|E|K|M|H|O|P|C|T|Y|X){2}(\s|\-)?\d{2,3}
~~*(A|B|E|K|M|H|O|P|C|T|Y|X){3}(\s|\-)?\d{3}(\s|\-)?\d{2,3} (\s|\n|\b|^\d)

Полис ОСАГО

~~*(^|\s|\n|\b)(xxx|aaa|bbb|ddd|ххх|ааа|ббб|)(-|\s})\d{10}($|\s|\n|\b)

IP адрес

~(\s|^|\n|\b)((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4}(\s|\n|\b)

Найти дату рождения, причём может быть и 2.2.1982 и 02.02.1982 2.2.82 и т.д.

С 1970 по 2019 год

~(\s|$|\n|^|\b)(((0?[1-9]|[1,2][0-9]|3[0,1])(\.|\-))((0?[1-9]|1[0,2])(\.|\-))|(((0?[1-9]|1[1,2])(\.|\-))(0?[1-9]|[1,2][1-9]|3[0,1])(\.|\-)))([2]0[01][0-9]|(19)?[7-9][0-9])

С 1900 по 2039 год

~(\s|$|\n|^|\b)(((0?[1-9]|[1,2][0-9]|3[0,1])(\.|\-))((0?[1-9]|1[0,2])(\.|\-))|(((0?[1-9]|1[1,2])(\.|\-))(0?[1-9]|[1,2][1-9]|3[0,1])(\.|\-)))([2]0[0-3][0-9]|(19)?[0-9][0-9])

Найти слово не важно какого регистра, например Слово Слово СЛОВО сЛоВо

~~*слово

Телефонный номер мобильный

~(8|\+7)?(\-|\s)?((9\d{9})|(\(?9\d{2}\)?)(((\-|\s)\d{2,4}){2,3}|(\s|-)\d{7}))

Телефонный номер стационарный, с конкретным кодом города и абстрактным

~(8|\+7)?(\-|\s)?((383\d{7})|(\(?383\)?)(((\-|\s)\d{2,4}){2,3}|(\s|-)\d{7})) – код 383
~(8|\+7)?(\-|\s)?((495\d{7})|(\(?495\)?)(((\-|\s)\d{2,4}){2,3}|(\s|-)\d{7})) – код 495
~(8|\+7)?(\-|\s)?((499\d{7})|(\(?499\)?)(((\-|\s)\d{2,4}){2,3}|(\s|-)\d{7})) – код 499
~(8|\+7)?(\-|\s)?((812\d{7})|(\(?812\)?)(((\-|\s)\d{2,4}){2,3}|(\s|-)\d{7})) – код 812

Примечание

X(xxx)xxxxxxx и варианты – с абстрактным кодом будет слишком много левых срабатываний