воскресенье, 22 декабря 2013 г.

Решение задач с Regex.One (с объяснениями)


С первого взгляда Регулярные выражения (Regex) могут показаться очень непонятными и сложными, поэтому после теоретического материала, лучше обязательно попрактиковаться на реальных примерах и упражнениях.
Лично для меня источником таких упражнений является сайт:
Прежде чем читать мои попытки пройти там задания, вам лучше самостоятельно пройти их, задания там очень легкие, если честно :)
Решение будет скоро, примерно через неделю )

Решение:

Первое задание: Letters

  • abcdefg
  • abcde
  • abc
Видно, что 3 буквы повторяются во всех трех строках abc, поэтому можно применить тупо выражение : 
abc
но вдруг нам надо 3 буквы, которые будут стоять рядом по алфавиту, то мы используем:
[a-c]{3}
То есть в этот паттерн будут входить abc, bac, cab итд. [a-c] означает группу, а {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


your task text capture
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 Jan 1987 (Jan 1987, 1987)
 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

0 коммент.:

Отправить комментарий