С первого взгляда Регулярные выражения (Regex) могут показаться очень непонятными и сложными, поэтому после теоретического материала, лучше обязательно попрактиковаться на реальных примерах и упражнениях.
Лично для меня источником таких упражнений является сайт:
Прежде чем читать мои попытки пройти там задания, вам лучше самостоятельно пройти их, задания там очень легкие, если честно :)
Решение будет скоро, примерно через неделю )
Решение:
Первое задание: Letters
- abcdefg
- abcde
- abc
Видно, что 3 буквы повторяются во всех трех строках abc, поэтому можно применить тупо выражение :
abc
но вдруг нам надо 3 буквы, которые будут стоять рядом по алфавиту, то мы используем:
[a-c]{3}
То есть в этот паттерн будут входить abc, bac, cab итд. [a-c] означает группу, а {3} - то что букв всего 3.
\w{3} - любая буква, цифра или подчеркивание 3 раза
\w{3} - любая буква, цифра или подчеркивание 3 раза
Второе задание: Digits
- abc123xyz
- define “123”
- var g = 123;
Видно, что повторяются 3 цифры 123:
123 - если явно 3 цифры
\d{3} - цифры 3 раза
\w{3} - более нестрогое, если еще и буквы и _
[1-3]{3} - {123, 321, 213 итд (аналог \d{3} }
Третье задание: the Dot
Здесь уже сложнее, так как есть паттерн который НЕ НАДО выбирать
- match text cat.
- match text 896.
- match text ?=+.
- skip text abc1
Видно, что здесь в каждом примере повторяется символ точка и перед точкой какие-то другие символы, но нельзя забывать, что в регексах есть оператор точка!, а если мы хотим найти символ точку, то нужно использовать слэш. Слэш экранирует символ.
.{3}\.
"." - любой символ {3} раза
"\." - поиск точки
По идее можно использовать точку вот так:
\.
Четвертое задание: Matching specific characters
- match text can
- match text man
- match text fan
- skip text dan
- skip text ran
- skip text pan
Видно, что регекс должен содержать c,m,f первым символом и не содержать d,r,p, используем группировку:
[cmf]an
Пятое задание: Excluding specific characters
- match text hog
- match text dog
- skip text bog
Здесь мы должны исключить символ b, это используется с помощью спецсимвола ^. Отрицание работает ТОЛЬКО в КВАДРАТНЫХ СКОБКАХ.
[^b]og
Также по заданию можно было использовать предыдущую технику:
[hd]og
Шестое задание: Character ranges
- match text Ana
- match text Bob
- match text Cpc
- skip text aax
- skip text bby
- skip text ccz
Ну решение состоит в группировке, здесь я думаю все понятно:
[A-C][nop][a-c]
Седьмое задание: Catching some zzz's
- match text wazzzzup
- match text wazzzup
- skip text wazup
Оч хороший пример, видно, что wazzz повторяется в двух примерах, но в некоторых жизненных ситуациях z может повторяться и больше 3ех раз, поэтому лучше использовать квантификаторы, они обозначаются обычно в фигурных скобках:
waz{3}z?up
z{3} //значит, что z может повторяться только 3 раза
z? //значит, что z может повторяться от 0 до 1 раза. (можно заменить на {0,1}
waz{3}z{0,1}up
Более лаконично:
waz{2,4}up
Восьмое задание: Mr Kleene
- match text aaaabcc
- match text aabbbbc
- match text aacc
Как обычно группировка:
a{2,4}b{0,}c{1,2}
Но это не лаконично:
[abc]+ //Плюс значит один или более {1,} - эквивалент
Совсем не лаконично:
a*b*c*
Девятое задание: Characters Optional
- match text 1 file found?
- match text 2 files found?
- match text x files found?
Хм, мы можем использовать логический оператор или ("|") и применить к нему квантификатор от 0, потому что число может быть и двухзначным и трехзначным итд.
К тому же на конце file может быть s или не может.
И нельзя забывать, что "?" - метасимвол, его нужно экранировать.
(\d|x){0,} files? found\?
Десятое задание: All this whitespace
- match text 1. abc
- match text 2. abc
- match text 3. abc
- skip text 4.abc
Увы, здесь пробелы при копировании не отобразились но суть в том, что нужно использовать метасимвол \s который обозначает пробел
\d\.\s{1,}abc
Одиннадцатое задание: Starting and ending
- match text Mission: successful
- skip text Last Mission: unsuccessful
- skip text Next Mission: successful upon capture of target
Здесь в этом задании надо использовать символы окончания и начала строки (^ - начало и $ - конец).
^M - первая строка начинается с M
^[^LN] - первая строка не начинается с L или N
\ssuccessful$ - так как перед successful пробел, successful - идет в конце
\bsuccessful$ - \b - разделитель между словами
Двенадцатое задание: Match Groups
capture text file_a_record_file.pdf (file_a_record_file)
capture text file_yesterday.pdf (file_yesterday)
skip text testfile_fake.pdf.tmp
Суть в том, что нужно чтобы результатом выборки были строки в скобке. Делать это надо через механизм запоминающих скобок: "( )"
(file.*)\.pdf$
Видно, что на конце должно быть расширение .pdf, поэтому ставим знак окончания строки. Потом в запоминающих скобках выражение, которое содержится во всех строках. Запоминающие скобки помогают возвратить результат работы регекса.
Тринадцатое задание: Nested Groups
capture text May 1969 (May 1969, 1969)
capture text Aug 2011 (Aug 2011, 2011)
Суть в том, что мы должны использовать ВЛОЖЕННЫЕ запоминающие скобки.
Например мы хотим захватить все содержимое, мы делаем в скобках (.*) - это захватит к примеру всю строку Jan 1987, плюс мы хотим еще вывести год, тогда мы добавляем в скобках еще скобки
(.*(\d{4}))
Еще более точно:
(\w+\s(\d{4}))
Четырнадцатое задание: More Work Group
(\d+)x(\d+)
15
I love (cats|dogs)
16