Я хочу предложить вам поломать голову вечерок-другой над интересными задачками, на регулярные выражения, которые Callum Macrae выкладывает на своем сайте на GitHub каждый Вторник.
Каждый вопрос представлен в виде набора тестов. Задача — написать такой регулярное выражение, чтобы все тесты стали зелеными.
Некоторые из задач сами по себе довольно простые, а самая интересная часть — в том, чтобы написать наиболее короткое возможное регулярное выражение.
Тесты используют JavaScript Regex движок вашего браузера, который обладает всеми основными возможностями PCRE. Подробнее можно посмотреть тут (англ.) , в колонке ECMA в таблице.
Я собрал в этой статье русские версии задач и материалов, которые могут помочь в их решении. Было бы интересно увидеть самые интересные решения в комментах.
1. Выделяем повторяющиеся слова (Ссылка ведет на задачу)
Задача:
Выделить тегом <strong> повторяющиеся слова.
Примеры:
Тhis is a test
=>this is <strong>is</strong> 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)
Главное не перепутать с картинками: ![alt text](image location)
Примеры:
[Basic link](http://example.com)
=><a
href="http://example.com">Basic link</a>
[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!
— Нет
Автор: z6Dabrata