Разминаем мозг регулярными выражениями — Regex Tuesday Challenge

—

от автора

Я хочу предложить вам поломать голову вечерок другой над вами задачками на регулярные выражения, которые 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! — Нет

ссылка на оригинал статьи http://habrahabr.ru/post/167015/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *