Мы Проходим Испытание Regexplay На 100%

Задача Лаборатории машинного обучения Университета Триеста (Италия) предлагает решать Всего 12 заданий, причем уровень заданий сильно варьируется — от суперпростых до сложных.

Конечно, решений может быть несколько, и тестовые примеры задачи не охватывают все варианты.

Тем не менее, если вы набрали 100%, то поздравляю! Тест пройден.

Спойлер: в некоторых задачах (особенно простых) подсказка является практически решением.



Задание 1 – найди числа

Есть текст, содержащий цифры, вам нужно найти все цифры.

Сложность: очень легко.

Зацепка Вы должны использовать цифровой символ и квантификатор множественности.

Решение

\д+
«[0-9]+» также является правильным решением.

Анализ решения

  • «\d» или «[0-9]» — это любой одиночный символ от 0 до 9.
  • «+» — допускается использование одного или нескольких символов.



Задача 2 — найти mac-адреса

Есть текст, содержащий мак-адреса, их нужно найти.

Сложность: легко.

Зацепка Вы должны использовать символ, обозначающий любую букву или цифру, двоеточие для разделения и квантификатор множественности.

Решение

\w{2}:\w{2}:\w{2}:\w{2}:\w{2}:\w{2}
«+» вместо «{2}» — тоже правильное решение, хотя и не совсем точное.

Анализ решения

  • «\w» — любой буквенный символ или любое число.

  • «{2}» — допускается использование только 2 символов.

Лучшее решение Те, кто знаком с mac-адресом, заметили, что mac-адрес записывается в шестнадцатеричной системе счисления.

А в предыдущем решении использовался знак \w, обозначающий любой символ алфавита и все цифры.

Согласен, наверное, в этом нет необходимости, но мы можем это учесть и заодно сократить штатный график.

([\da-f]{2}:){5}[\da-f]{2}
Анализ решения
  • «\d» — любая одна цифра, «a-f» — диапазон от a до f. Итого имеем допустимый набор символов 0123456789abcdef — то есть шестнадцатеричный код Hex. «{2}» — любые 2 символа из этого набора символов.

  • "([\da-f]{2}:)"{5} - допускается повторение двух символов шестнадцатеричный + двоеточие ровно 5 раз.

  • и в конце "[\da-f]{2}" — любые 2 символа из шестнадцатеричного набора


Задача 3 — найти ftp-адреса

Там текст с фтп адресами, надо их найти.

Сложность: легко.

Зацепка Вам нужно начать с ftp://, а затем перечислить разрешенные символы в адресе, не забывая о кванторе множественности.

Решение

ftp:\/\/[\w\d-_.\/]+
Анализ решения
  • «\/» — это обычный escape-символ «/».

  • внутри квадратных скобок находится список допустимых символов, а именно: любой буквенный символ или любая цифра, дефис, подчеркивание, точка или косая черта (если в имени есть другие символы, их можно добавить).



Задача 4 – найти закономерность

Есть некий форматированный файл, в котором нужно найти все строки, соответствующие шаблону $любые символы$.

Сложность: легко.

Зацепка Вам необходимо использовать экранирование зарезервированных символов, экранирование любых символов, квантификаторы множественности и ленивый режим.

Решение Задача тривиальная, но требует немного лучшего знания регулярных последовательностей.

\\$.

+?\\$

Анализ решения
  • «\\$» — бегство доллара.

  • ".

    +" - любое количество любых символов, "?" - убрать жадность.



Задача 5 — найти IP-адреса

Найдите IP-адреса из текста.

Сложность: легко.

Зацепка Очень похоже на вторую проблему.

Решение

\d+\.

\d+\.

\d+\.

\d+

Если вместо «+» вы написали «{1,3}» то вы молодец.

Анализ решения

  • "\d" — любая отдельная цифра,
  • «+» — любое количество символов, «{1,3}» — строгое ограничение количества символов (от 1 до 3).

Лучшее решение IP-адрес — это не просто цифры, а числа от 0 до 255.
\b((\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.

){3}(\d|[1 -9]\d|1\d{2}|2[0-4]\d|25[0-5])\b

Анализ решения Чтобы определить диапазон от 0 до 255 придется немного постараться:
  • «\d» — число от 0 до 9
  • "[1-9]\d" — число от 10 до 99
  • "1\d{2}" — число от 100 до 199.
  • "2[0-4]\d" — число от 200 до 249.
  • «25[0-5]» — число от 250 до 255
Далее мы позволяем повторяться последовательности чисел от 0 до 255 ровно 3 раза:
  • "(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5]).

    ){3}" - внутри стоит точка, потому что оно также повторяется 3 раза и заканчивается тем же диапазоном цифр, но без точки.

  • Добавляем в конец и начало слова ограничительный символ «\b» — это нужно, чтобы убрать из записи, например, текст «1172.30.42.109» (согласен, это маловероятно и, вероятно, ненужно).



Задача 6 – якорь

Извлеките тег href из html-документа.

Сложность: средняя.

Зацепка Для каждой скобки следует использовать «любой символ, кроме» и «или».

Решение

href=("[^"]+"|'[^']+')
Анализ решения
  • " — начинаем поиск с двойной кавычки.

  • «[^»]+» — тогда абсолютно любой символ, кроме двойной кавычки.

  • Заканчиваем двойными кавычками.

Все это заключаем в круглые скобки, добавляем знак или – «|» и повторите то же самое для одинарных кавычек.



Задача 7 – ссылки

Найдите все ссылки в свободном тексте.

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

Сложность: сложно.

Зацепка Вам нужно начать с http, использовать «любой символ, кроме» и завершить поиск допустимым символом.

Решение

http:\/\/([^> \s]+)[\w\/]
В задаче нет https-ссылок, но вы можете это учесть, добавив "s?" после http. Анализ решения
  • «[^> \s]+» ищет любые символы, кроме символа «> » и пробела.

    На самом деле прочитать это можно так: «пойдем, пока не увидим один из этих символов».

  • «[\w\/]» — разделитель, позволяющий завершить ссылку только латинским символом или косой чертой.

И в результате начинаем с http://, далее абсолютно любой символ кроме «<” or space characters, but at the end a Latin character or slash is required.
  • лишняя "с?" в "https?" просто разрешите как «http://», так и «https://».



Задача 8 – Заголовки

В HTML любой тег h+номер считается заголовком.

Сложность: средняя.

Зацепка Начните с h + цифра + любой символ или его отсутствие.

Решение Довольно просто:

.

*<\/h\d.*>

Анализ решения
  • "h\d" - здесь мы говорим, что после символа должно быть число "\d".

  • И тогда «.

    *» может содержать любое количество любых символов, иначе ничего не может идти.

Лучшее решение После h идет число, а в спецификации html указано, что допустимы числа от 1 до 6, а сам тег нельзя закрыть ничем, кроме треугольных скобок.

Поэтому такое решение будет более точным:

]*> .

+?<\/h[1-6]>

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

И поэтому еще более точным решением было бы использование ссылок: " ]*> .

+?<\/h\1> «.

Это не говоря уже о том, что тест не чувствителен к регистру.

Анализ решения

  • «h[1-6]» — здесь мы говорим, что после «h» должно быть число от 1 до 6.
  • «[^> ]*» — дальше могут идти абсолютно любые символы, кроме «> », а могут и нет.
Отдельно о дополнении:
  • Заключив выражение «(h[1-6])» в круглые скобки, мы создаем группу с номером 1.
  • Далее по ссылке на первую группу «\1» говорим, что хотим видеть в конце тот же h с тем же номером, что и в начале.



Задача 9 — Телефоны

В произвольном тексте найдите все телефоны в разных форматах.

Сложность: сложно.

Зацепка Необходимо использовать знак наличия или отсутствия символа, квантор ограничения количества цифр и построение набора символов.

Возможен дизайн или.

Решение

\(?\d{3}[\).

\/-]{1,2}\d{3}[-.

]\d{4}

Это будет работать, но допускает два символа после первых трех цифр — хорошо, если это закрывающая скобка и пробел после нее, и плохо, если это два дефиса.

Поэтому существует немного более точное решение: "\(?\d{3}(\) ?|[.

\/-])\d{3}[-.

]\d{4}" Анализ решения

  • "\(?" - указываем возможность наличия символа "(" или его отсутствие, экранируем его, поскольку это зарезервированный символ.

  • «\d{3}» — числа с ограничением только 3.
  • Другими возможными символами являются «[\].

    \/-]{1,2}» — косая черта, закрывающая скобка, точка, пробел, обратная косая черта и дефис.

    {1,2} — указывает, что таких символов может быть 1 или 2. Например, закрывающая скобка и пробел после нее.

  • Далее обязателен «[-.

    ]» — дефис или точка.

  • А «\d{4}» — это четыре цифры в конце.



Задача 10 - авторы

Существует некий шаблон, содержащий элементы, найдите всех авторов из поля автора.

Сложность: очень сложно.

Зацепка Необходимо исходить из того, что все имена авторов начинаются с заглавной буквы и пишутся по образцу.

Решение

[A-Z][A-Za-z-']+, [A-Z](\{\\"\w\})?[A-za-z-']*( [A-Z][A-Za-z- ']*)?
Это решение правильное, но имеет минус.

Мы обошли "{\"u}" с помощью костыля "({\"\w})?" и в принципе это работает, если вставить этот костыль и в другие части фамилий авторов.

В любом случае, если вы смогли как-то решить эту проблему – это очень здорово! Анализ решения

  • «[A-Z][A-Za-z-']+» — Ищем слово, которое должно начинаться с заглавной буквы, затем содержать любой буквенный символ, дефис или апостроф.

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

    Это означает, что кусок «{\»u}» может как присутствовать, так и отсутствовать.

  • И тут снова точно так же, как и в первом случае "([A-Z][A-Za-z-']*)?", только это выражение заключено в группу и есть знак "?" означает, что это условие не является обязательным.

P.S. перечисление [А-За-з] здесь является вынужденной мерой, поскольку тест не содержит модификаторов.

Лучшее решение Есть более компактное и простое решение, позволяющее отказаться от костыля выше:

[A-Z]\S+, [A-Z]\S*( [A-Z][\S]*)?\b
Анализ решения
  • "[A-Z]\S+, " - сначала обязательно заглавная буква "[A-Z]", затем любое количество непробельных символов "\S+" до точки с запятой ", ".

  • Далее почти то же самое «[A-Z]\S*» — оно должно начинаться с заглавной буквы, а затем любой непробельный символ до границы слова «\b».

  • "([A-Z][\S]*)?" - и между ними есть одна и та же, но не обязательная, группа для отчества.



Проблема 11 — Содержимое заголовка

Точно так же, как и в задании 8, только вам нужно найти не сами заголовки, а их содержание.

Сложность: сложно.

Зацепка Задача идентична задаче 8. Это несложно, если вы умеете смотреть назад и вперед. Имеет решение с оглядкой и без оглядки.

Решение Не оглядываясь назад:

([\w ]*<[^h].

+|[^<> ]+)(?=<\/h\d> )

Анализ решения
  • "([\w ]*<[^h].

    +|[^<> ]+)» — есть два варианта начала содержимого заголовка.

    Первый — с тега внутри «[\w ]*<[^h].

    +" - in this case, you need to make sure that this is not an h tag and take into account the fact that there may be text before the tag. The second option is text without tags "[^<> ]+», то есть любые символы, кроме открывающего и закрывающего тега.

  • "(?=<\/h\d> )» — это просмотр вперед, который должен содержать закрывающий тег h.
Оглядываясь назад:
(?<= ]+> ).

+?(?=<\/h\d> )

Плюс ко всему вы можете учесть все замечания по решению задачи 8. Анализ решения
  • "(?<= ]+> )» — это взгляд назад, внутри которого должен быть тег h.
  • "(?=<\/h\d> )» — это просмотр вперед, который должен содержать закрывающий тег h.


Задача 12 – список авторов

Задача аналогична задаче 10, но на мой взгляд проще.

Сложность: сложно.

Зацепка Все основные принципы из задачи 10, но нужно учитывать начало строки.

Решение, которое я знаю, использует ретроспективный анализ.

Решение

(?<=^\d+\.

)[A-Z][\w]+, [A-Z][\w\.

]+

Анализ решения
  • "(?<=^\d+.

    )" - looking back where there must be any number of digits from a new line to a point with a space.

  • «[A-Z][\w]+,» — затем любое слово от заглавной буквы до точки с запятой и снова то же самое «[A-Z][\w.]+».

Или, проще говоря, это:
(?<=^\d+\.

)[^,]+,[^,:]+

Анализ решения
  • "(?<=^\d+.

    )" - looking back where there must be any number of digits from a new line to a point with a space.

  • «[^,]+,» — любое количество любых символов до запятой + запятая.

  • "[^,:]+" - любое количество любых символов до запятой или двоеточия.

Теги: #регулярные выражения #regex #regex
Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.