Регулярные выражения¶
Что такое регулярные выражения?¶
Регулярные выражения представляют собой сильный инструмент для поиска строк, проверки их на соответствие какому-либо шаблону и другой подобной работы.
В первую очередь стоит заметить, что любая строка сама по себе является регулярным выражением. Так, выражению „Хаха“, очевидно, будет соответствовать строка „Хаха“ и только она. Регулярки являются регистрозависимыми, поэтому строка „хаха“ (с маленькой буквы) уже не будет соответствовать выражению выше.
Однако уже здесь следует быть аккуратным — как и любой язык, регекспы имеют спецсимволы, которые нужно экранировать. Вот их список: . ^ $ * + ? { } [ ] \ | ( ). Экранирование осуществляется обычным способом — добавлением перед спецсимволом. В Staffcop можно посмотреть описание данных спецсимволов и попробовать создать свое выражение в конструкторе регулярных выражений. Например, можете создать политику поиск словарю и там будет возможность перейти в конструктор.
- Важно: Спецсимвол \b по разному отрабатывает в postgresql, clickhouse.
В postgresql она подменятеся на \y которое срабатывает на начало и конец слова, в том числе после спецсимвола, в том числе с юникодом
В clickhouse юникод не поддерживатся, начало слова считается только после пробела/табуляции/начала строки
Если вам требуется больше спецсимволов, то можете использовать сайт для создания выражений 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 и варианты – с абстрактным кодом будет слишком много левых срабатываний