Я хочу предложить вам поломать голову вечерок-другой над интересными задачками, на регулярные выражения, которые Callum Macrae выкладывает на своем сайте на GitHub каждый Вторник.
Каждый вопрос представлен в виде набора тестов. Задача — написать такой регулярное выражение, чтобы все тесты стали зелеными.
Некоторые из задач сами по себе довольно простые, а самая интересная часть — в том, чтобы написать наиболее короткое возможное регулярное выражение.
Тесты используют JavaScript Regex движок вашего браузера, который обладает всеми основными возможностями PCRE. Подробнее можно посмотреть тут (англ.) , в колонке ECMA в таблице.
Я собрал в этой статье русские версии задач и материалов, которые могут помочь в их решении. Было бы интересно увидеть самые интересные решения в комментах.
UPD: В регулярных выражениях ECMAScript нету ретроспективных проверок.
Почитать про цвета можно по этой ссылке.
Автор облегчает задачу: в каждом месяце 30 дней.
Почитать подробнее про MarkDown можно в википедии.
Примеры:
Примеры:
Главное не перепутать с картинками:
Есть несколько правил:
Предполагается использование моноширинного шрифта. Строки длиннее 32х символов переносятся.
Примеры:
Для интересующихся есть неплохая статья об аккордах на русском и английская статья на википедии, где используются соответствующие символы
Так же обратите внимание, что диез (♯)
это не то же самое, что решетка (#).
Вот ссылка на русскую версию спецификаци.
Каждый вопрос представлен в виде набора тестов. Задача — написать такой регулярное выражение, чтобы все тесты стали зелеными.
Некоторые из задач сами по себе довольно простые, а самая интересная часть — в том, чтобы написать наиболее короткое возможное регулярное выражение.
Тесты используют JavaScript Regex движок вашего браузера, который обладает всеми основными возможностями PCRE. Подробнее можно посмотреть тут (англ.) , в колонке ECMA в таблице.
Я собрал в этой статье русские версии задач и материалов, которые могут помочь в их решении. Было бы интересно увидеть самые интересные решения в комментах.
UPD: В регулярных выражениях ECMAScript нету ретроспективных проверок.
1. Выделяем повторяющиеся слова (Ссылка ведет на задачу)
Задача:
Выделить тегом <strong> повторяющиеся слова.Примеры:
Тhis is a test=>this is a test
Тhis is is a test=>this is <strong>is</strong> a test
2. Оттенки серого
Задача:
Выбрать отенки серого в разных цветовых системах.Почитать про цвета можно по этой ссылке.
Примеры:
#FFF — Даrgb(2.5, 2.5,2.5) — Даrgb(2, 4, 7) — Нет3. Даты найти строки сответствующем этому шаблону: YYYY/MM/DD HH:MM(:SS)
Задача:
Выбрать существующие даты между 1000 и 2012 годом. Секунды могут быть опущены.Автор облегчает задачу: в каждом месяце 30 дней.
Примеры:
2012/09/18 12:10 — Да2013/09/09 09:09 — Нет (после 2012)4. Курсив в MarkDown
Задача:
Преобразовать текст, обрамленный в звездочки, в курсив. Не трогать текст в двойных звездочках (жирный).Почитать подробнее про MarkDown можно в википедии.
Примеры:
*this is italic*"=><em>this is italic</em>
**bold text (not italic)**=>**bold text (not italic)**
5. Числа
Задача:
Выбрать числа с запятой или пробелом, в качестве разделителя разрядов. (к счастью обошлось без моммайе)Примеры:
8,205,500.4672 — Да1,5826,000 — Нет6. IPv4 адреса
Задача:
Выбрать IPv4 адреса во всех возможных, представлениях: десятичном, шестнадцатеричном и восьмеричном. С точками и без. Подробнее про IP адреса можно узнать в википедииПримеры:
99.198.122.146 — Да0xFF.255.0377.0x12 — Да256.256.256.256 — Нет7. Доменные имена
Задача:
Доменные имена для протоколов http и https, с необязательным слешем в конце. Специальые символы не используются.Примеры:
http://example.com/ — Даexample.com — Неткремль.рф — Нет :(8. Повторяющиеся пункты в списке MarkDown
Задача:
Найти и выделить жирным (**) повтряющиеся пункты в MarkDown-списке.Примеры:
* First list item
* Second list item
=>
* First list item
* Second list item
* Repeated list item
* Repeated list item
=>
* Repeated list item
* **Repeated list item**
9. Ссылки в MarkDown
Задача:
Преобразовать MarkDown ссылки в HTML. Выглядят вот так:[text](http://example.com)Главное не перепутать с картинками:
Примеры:
[Basic link](http://example.com)=><a href="http://example.com">Basic link
[Invalid](javascript:alert())=>[Invalid](javascript:alert())
10. Делим предложение на токены.
Задача:
Разбить предложение на токены. Это может быть полезно, например, для поисковой системы.Есть несколько правил:
- Несколько слов в кавычках должны попасть в один токен
This "huge test" is pointless=>this,huge test,is,pointless - Слова написанные через дефис так же попадают в один токен.
Слова написанные через несколько дефисов (тире), или имеющие дефис в начале или в конце попадают в раздельные токены.
Suzie Smith-Hopper test--hyphens=>Suzie,Smith-Hopper,test,hyphens. - Сокращения (стяжения) попадают в один токен
I can't do it=>I,can't,do,it. - Вся пунктуация кроме апострофов и дефисов должна быть убрана.
Too long; didn't read=>Too,long,didn't,read.
11. Буквы в алфавитном порядке.
Задача:
Выбрать последовательность неповторяющихся символов в алфавитнои порядке.Пробелы нужно игнорировать. К сожалению известные мне решения не очень удачны.Примеры:
abcdefghijk — Даabbc — Нет12. Исправляем пробелы
Задача:
Убрать повторяющиеся пробелы и знаки табуляции, оставить по одному пробелу между словами и по два между предложениями.Примеры:
Extra spaces=>Extra spaces
Sentence. Sentence.=>Sentence. Sentence.
13. Повторяющиеся слова друг под другом
Задача:
Выбрать повторяющиеся слова, которые находятся непосредственно друг под другом.Предполагается использование моноширинного шрифта. Строки длиннее 32х символов переносятся.
Примеры:
This sentence is pretty long and
this sentence is also a test— Да
This sentence also shouldn't
match as this has no words
below.— Нет
14. Брутфорсим химические элементы
Задача:
>Выбираем первые 50 химических элементов таблицы менделеева. Решение довольно очевидное, поэтому задача — найти максимально короткое решение.Примеры:
H — ДаM — Нет15. Музыкальные аккорды
Задача:
Выбрать музыкальные аккорлы, например как Cmin, или Bmaj. Нужны и краткая и полная записи. Для данной задачи предпложим, что аккорды E♯, B♯, F♭ and C♭ не существует.Для интересующихся есть неплохая статья об аккордах на русском и английская статья на википедии, где используются соответствующие символы
Так же обратите внимание, что диез (♯)
это не то же самое, что решетка (#).
Примеры:
C — ДаZ — Нет16. Брутфорсим химические элементы
Задача:
Выбрать химические элементы с атомным числом больше 50.Примеры:
I — ДаA — Нет17. Регулярное выражение для регулярного выражения.
Задача:
Выбрать правильно построенное регулярное выражение.Для начала ограничимся литералами (возможно экранированными), классами и несколькими квантификаторами.Примеры:
/regexp?/ — Даregex — Нет18. IRC — Сообщения
Задача:
Выбрать правильно сформированное IRC сообщение.Вот ссылка на русскую версию спецификаци.
Примеры:
[_]!abc@test PRIVMSG #chat :Test — Даc.m!callum@lynx.io PRIVMSG #chat :Hello! — Нет