Освой программирование играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
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 | Ответы на вопросы |
Я для себя выписал на память кое-то в виде неупорядоченных записей.
Онлайн-сервисы
Регулярные выражения - это язык поиска и манипуляций с подстроками в тексте. По сути это строка-образец, состоящая из символов и метасимволов и задающая правило поиска.
Порой сложно задать нужную строку для поиска. Склонения, окончания, регистр, изменяемая часть выражения и другие причины.
Удобно работать с большим текстом.
В 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 protected] \w+@\w+.\w+
html tag
<a> <[^<]+?>
hexidecimal color #aabbcc
#?[0-9A-Fa-f]{6}
UNIX - найти запущенные процессы из папки bin.
Найти все email в тексте
Notepad++ (47.40)
Java (54.35)