Сайт разработчика Александра Климова

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

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

Очень интересная тема, до которой у меня вечно не доходят руки. На практике почти не приходится использовать, но вещь безусловно полезная.

Для первого знакомства можно посмотреть видео Вебинар: Что такое регулярные выражения?

00:00 – 02:37 Вступление. Повестка и цели вебинара.
02:38 – 04:35 История возникновения регулярных выражений
04:36 – 10:54 Что такое регулярные выражения? Определение. Пример пасинга лога
10:55 – 14:37 Синтаксис регулярных выражений. Обычные (литералы) и специальные символы. Экранирование специальных символов.
14:38 – 17:09 Наборы символов (классы); [0-9], [Aa]
17:10 – 17:54 Специальные метасимволы-сокращения. \d \D \s \S \w \W
17:55 – 20:00 Указание позиции в поиске: начало и конец строки, начало и конец слова
20:01 – 20:24 Группировка a(bc|b|x)cc
20:25 – 27:30 Последовательности {m, n}. *, +, ?
27:32 – 30:29 Перебор “(a|c|z)”
30:30 – 34:07 Практические примеры. Как прочитать регулярное выражение?
34:07 – 35:59 Инструменты проверки регулярных выражений
36:00 – 42:19 Простые задачи, которые можно решить при помощи регулярных выражений: парсинг телефонных номеров, email, html тэгов
42:20 – 47:36 Примеры практического применения регулярных выражений. Найти все запущенные процессы по шаблону, все email адреса в файле.
47:37 – 50:33 Регулярные выражения в Notepad++ и Total Commander
50:34 – 56:59 Использование регулярных выражений в программировании: Python, Java, JavaScript
57:00 – 59:14 Применение регулярных выражений в автоматизации тестирования
59:15 – 1:01:31 Итоги.
1:01:32 – 1:09:45 Ответы на вопросы

Я для себя выписал на память кое-то в виде неупорядоченных записей.

Онлайн-сервисы

regexr.com

regexpal.com

Регулярные выражения - это язык поиска и манипуляций с подстроками в тексте. По сути это строка-образец, состоящая из символов и метасимволов и задающая правило поиска.

Порой сложно задать нужную строку для поиска. Склонения, окончания, регистр, изменяемая часть выражения и другие причины.

Удобно работать с большим текстом.

В http://regexr.com/ пишем онлайн регулярное выражение, и нам сразу показывается, где эти строки.


(WARN|ERROR)

Как вариант


^.*(WARN|ERROR).*\((.*):(\d=)\)$
$1 in class $2 in line $33

Просто этим строчками меняем текст логов в удобный текст.

Обычный текст ищем как есть.

Есть спецсимволы, например, @, который также доступен для поиска.

Экранирование

Есть специальные символы, которые используются в регулярных выражениях, поэтому их не получится искать. К ним относятся


)( ] [ \ ^ $ . | ? * +

Их следует экранировать, т.е. поставить обратный слеш (\).

Для чего же он нужен? Рассмотрим простой пример. У нас есть строка с несколькими предложениями, в которых нам необходимо найти точки. Если вы попробуете это сделать, то будут выделены все символы. Дело в том, что точка является специальным метасимволом, которая заменяет любой символ в регулярном выражении, кроме переноса строки (см. ниже).

Нам следует указать, что точка в нашем случае должна быть не метасимволом, а обычным символом-точкой (\.). Экранируя любой метасимвол, мы превращаем его в обычный символ. Это относится и к самому обратному слешу, для экранирования используем \\.

Метасимвол точка

Точка заменяет любой символ в регулярном выражении. Если задать точку в регулярном выражении, то будут выделены все символы: буквы, цифры, пробел, точка, запятая и т.д. При этом точка совпадает с одним символом, но благодаря модификатору g поиск не ограничивается первым совпадением и продолжается дальше.

Создайте пример из трёх строк. Если мы добавим квантификатор + после точки (.+), то тем самым зададим поиск совпадающих символов от одного до бесконечности.

Обратите внимание, что регулярное выражение сообщит, что найдено три совпадения (по числу строк), а не количество всех символов, как это было бы без знака плюс.

Поскольку точка не совпадает с символом перевода строки, шаблон найдет совпадение до конца строки.

Мы знаем, что можно экранировать метасимвол точки, чтобы найти обычную точку.

Есть и другой способ - поместить точку в символьный класс, где она рассматривается как обычный символ: [.]+.

Использовать метасимвол точки полезно, когда есть строка с динамической составляющей, которая меняется. http://example.com/pictures/123/

Тогда для строки /pictures/123/, где числа 123 могут меняться, применим паттерн:


\/pictures\/...\/

Мы экранировали слеши, ищем слово pictures, а также любые три символа (обязательно) после этого слова и слеша.

Наборы символов [Квадратные скобки]

Наборы символы позволяют задать определенные ограничения или диапазон. Например, если мы знаем, что будут выводиться только три цифры, то не обязательно использовать три точки, а можно сузить поиск. Для этого используются квадратные скобки, в которых указывается набор символов. Причем ищется только один символ.

Такой пример \/pictures\/[0-9]\/ будет находить строку /pictures/1/ (с одним символом), но не найдет /pictures/123/

Можно указать буквы [a-z] - любой символ алфавита.

Символ ^ означает НЕ - [^ae]

Можно указывать не диапазон, а просто указать нужные символы. Например, [19] (напоминаю, только один символ)

Тогда \/pictures\/[19]\/ найдет варианты /pictures/1/ и /pictures/9/

Есть готовые сокращения для диапазонов


\9 [0-9] цифры
\D [^\d] не цифры
\s [\f\n\r\t\v] пробельный символ
\S [^\s] не пробельный символ
\w [\da-zA-Z_] буквенный символ
\W [^\w] не буквенный символ

Позиция

Если мы хотим найти какой-то конкретный текст, который заканчивается с определенным набором символов, то используется символ $


Рыжик - это кот.
Рыжик - это кот
кот по имени Рыжик.

Тогда выражение кот$ найдет слово только во второй строке. В первой в конце есть точка. В третьей слово начинается, а не заканчивается.

Для поиска строк, которые начинаются на определенное слово используется символ ^. Выражение ^кот найдет слово в третьей строке.

Символ \b определяет границу слова, \B - не границу слова.

Например, выражение [A-Z] будет находить все заглавные буквы. В том числе по два символа в словах TextView, StatusBar, EditText

Если использовать \b[A-Z] то ищутся символы, которые является границей слова. Т.е. будет находить первые заглавные буквы в указанных словах. Соответственно, \B[A-Z] наоборот найдет вторые заглавные буквы в этих словах.

Группировка (Круглые скобки)

Напомню, что круглые скобки являются метасимволами, поэтому их нужно экранировать, если вы ищете круглые скобки в тексе.

В основном удобна для замены. Допустим мы ищем какое-то слово. Помещаем его в круглые скобки, таким образом мы определили группу. Это простейший вариант.

Допустим, нас интересует слово gray. Можно просто написать это слово целиком в качестве шаблона. Однако слово gray часто пишут несколько как grey. Это также допустимый вариант.

Как же нам указать, что могут два варианта, которые нас интересуют? Вот здесь и пригодятся круглые скобки, которые произведут необходимую группировку.


gr(a|e)y

Мы можем таким образом создать несколько групп. При этом они нумеруются. Первая группа будет доступна в переменной под номером один — $1, вторая - $2 и т.д.

Создадим две группы. Теперь мы можем манипулировать этими группами. Для этого используем $1 и $2 для ссылки к этим группам. Тогда запись $2 $1 поменяет слова местами в тексте (режим Replace).

Для примера возьмём строку.


Кот, который гулял сам по себе

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


(гулял) (сам по себе)

В режиме Replace пишем.


$2 $1

Теперь строка должна быть:


Кот, который сам по себе гулял

Можно использовать back reference, если мы знаем, что текст в группе повторяется. Тогда можно не писать (cat)(cat), а заменить на (back)\1

Последовательности {Фигурные скобки}

Последовательности задаются фигурными скобками.

Если использовать [A-Z] то найдутся большие заглавные буквы, но один раз. А выражение [A-Z]{1,4} указывает, что нужно показать все повторяющиеся символы от 1 до 4 раз. Можно указать точное значение [A-Z]{3} - найдет слова, где идут именно три заглавные буквы подряд.

До четырех символов [A-Z]{,4}
От четырех символов [A-Z]{4,}

Существует сокращения для них *, +, ?

* - {0,} ноль или более символов
+ - {1,} один или более символов
? - {0,1} ноль или один символ

^.*слово$ - такое выражение найдет целую строку, которое заканчивается на слово.

Перебор

TExT|TEXT - найдет два варианта слова, которые написаны в разных регистрах. | - это или. Как вариант TE(x|X)T - третий символ мы определили в двух вариантах.

Читать регулярные выражения


([0-9]+)\s.*\s(\d\d\d\d)$

В круглых скобках идет набор символов. В квадратных скобках идет набор цифр от 0 до 9, который может повториться один раз. Дальше пробел, бесконечное количество символов. Потом снова пробел. Потом идут четыре цифры подряд, которые обязательно являются концом строки. Например.


044 - 1234
asdf 123 asdf 1234

^[tT]ele\d$

Крышка - начало строки. Далее маленькая или большая буква T. Дальше три литерала. В конце строки должна быть цифра. Пример.


Tele2
tele1

([mM]y name is|I am)\s[Mm]ykhailo [Pp]oliarush

Разные вариации


My name is Mykhailo Poliaruhs
I am mykailo Poliaruhs

Задачи

Телефонный номер 066.225-23-23

Три цифры, точка обязательно, три цифры, тире, две цифры, тире, две цифры.


[0-9]{3}\.(\d{2,3}|-)*

Как вариант, можно было написать


\d{3}\.\d{3}-\d{2}-\d{2}

parse http: http://host.com/parameters


[htps]+://\w{2,}.\w+/\w+

parse email


email@gmail.com \w+@\w+.\w+

html tag


<a> <[^<]+?>

hexidecimal color #aabbcc


#?[0-9A-Fa-f]{6}

Применение

UNIX - найти запущенные процессы из папки bin.
Найти все email в тексте

Notepad++ (47.40)

Java (54.35)

Реклама