- PVSM.RU - https://www.pvsm.ru -

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

Я хочу предложить вам поломать голову вечерок-другой над интересными задачками, на регулярные выражения, которые Callum Macrae выкладывает на своем сайте на GitHub [1] каждый Вторник.

Каждый вопрос представлен в виде набора тестов. Задача — написать такой регулярное выражение, чтобы все тесты стали зелеными.
Некоторые из задач сами по себе довольно простые, а самая интересная часть — в том, чтобы написать наиболее короткое возможное регулярное выражение.

Тесты используют JavaScript Regex движок вашего браузера, который обладает всеми основными возможностями PCRE.  Подробнее можно посмотреть тут (англ.) [2], в колонке ECMA в таблице.

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

1. Выделяем повторяющиеся слова [3] (Ссылка ведет на задачу)

Задача:

Выделить тегом <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. Оттенки серого [4]

Задача:

Выбрать отенки серого в разных цветовых системах.
Почитать про цвета можно по этой ссылке [5].

Примеры:

#FFFДа

rgb(2.5, 2.5,2.5)Да

rgb(2, 4, 7) Нет

3. Даты найти строки сответствующем этому шаблону: YYYY/MM/DD HH:MM(:SS) [6]

Задача:

Выбрать существующие даты между 1000 и 2012 годом. Секунды могут быть опущены.
Автор облегчает задачу: в каждом месяце 30 дней.

Примеры:

2012/09/18 12:10Да

2013/09/09 09:09Нет (после 2012)

4. Курсив в MarkDown [7]

Задача:

Преобразовать текст, обрамленный в звездочки, в курсив. Не трогать текст в двойных звездочках (жирный).
Почитать подробнее про MarkDown можно в википедии [8].

Примеры:

*this is italic*" => <em>this is
italic</em>

**bold text (not italic)** => **bold text (not
italic)**

5. Числа [9]

Задача:

Выбрать числа с запятой или пробелом, в качестве разделителя разрядов. (к счастью обошлось без моммайе)

Примеры:

8,205,500.4672Да

1,5826,000 Нет

6. IPv4 адреса [10]

Задача:

Выбрать IPv4 адреса во всех возможных, представлениях: десятичном, шестнадцатеричном и восьмеричном. С точками и без. Подробнее про IP адреса можно узнать в википедии [11]

Примеры:

99.198.122.146Да

0xFF.255.0377.0x12Да

256.256.256.256 Нет

7. Доменные имена [12]

Задача:

Доменные имена для протоколов http и https, с необязательным слешем в конце. Специальые символы не используются.

Примеры:

http://example.com/Да

example.com Нет

кремль.рфНет :(

8. Повторяющиеся пункты в списке MarkDown [13]

Задача:

Найти и выделить жирным (**) повтряющиеся пункты в 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 [14]

Задача:

Преобразовать 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. Делим предложение на токены. [15]

Задача:

Разбить предложение на токены. Это может быть полезно, например, для поисковой системы.

Есть несколько правил:

  • Несколько слов в кавычках должны попасть в один токен

    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. Буквы в алфавитном порядке. [16]

Задача:

Выбрать последовательность неповторяющихся символов в алфавитнои порядке.Пробелы нужно игнорировать. К сожалению известные мне решения не очень удачны.

Примеры:

abcdefghijkДа

abbcНет

12. Исправляем пробелы [17]

Задача:

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

Примеры:

Extra       spaces => Extra spaces

Sentence.      Sentence. => Sentence.  Sentence.

13. Повторяющиеся слова друг под другом [18]

Задача:

Выбрать повторяющиеся слова, которые находятся непосредственно друг под другом.
Предполагается использование моноширинного шрифта. Строки длиннее 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. Брутфорсим химические элементы [19]

Задача:

>Выбираем первые 50 химических элементов таблицы менделеева [20]. Решение довольно очевидное, поэтому задача — найти максимально короткое решение.

Примеры:

HДа

MНет

15. Музыкальные аккорды [21]

Задача:

Выбрать музыкальные аккорлы, например как Cmin, или Bmaj. Нужны и краткая и полная записи. Для данной задачи предпложим, что аккорды E♯, B♯, F♭ and C♭ не существует.

Для интересующихся есть неплохая статья об аккордах на русском [22] и английская статья на википедии, где используются соответствующие символы [23]

Так же обратите внимание, что диез (♯)
это не то же самое, что решетка (#).

Примеры:

CДа

Z Нет

16. Брутфорсим химические элементы [24]

Задача:

Выбрать химические элементы с атомным числом больше 50.

Примеры:

IДа

AНет

17. Регулярное выражение для регулярного выражения. [25]

Задача:

Выбрать правильно построенное регулярное выражение.Для начала ограничимся литералами (возможно экранированными), классами и несколькими квантификаторами.

Примеры:

/regexp?/Да

regexНет

18. IRC — Сообщения [26]

Задача:

Выбрать правильно сформированное IRC сообщение.
Вот ссылка на русскую версию спецификаци. [27]

Примеры:

[_]!abc@test PRIVMSG #chat :TestДа

c.m!callum@lynx.io PRIVMSG #chat :Hello!Нет

Автор: z6Dabrata

Источник [28]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/javascript/25671

Ссылки в тексте:

[1] на своем сайте на GitHub: http://callumacrae.github.com/regex-tuesday/

[2] посмотреть тут (англ.) : http://www.regular-expressions.info/refflavors.html

[3] Выделяем повторяющиеся слова : http://callumacrae.github.com/regex-tuesday/challenge1.html

[4] Оттенки серого : http://callumacrae.github.com/regex-tuesday/challenge2.html

[5] по этой ссылке: http://htmlbook.ru/css/value/color

[6] Даты найти строки сответствующем этому шаблону: YYYY/MM/DD HH:MM(:SS) : http://callumacrae.github.com/regex-tuesday/challenge3.html

[7] Курсив в MarkDown : http://callumacrae.github.com/regex-tuesday/challenge4.html

[8] в википедии: http://ru.wikipedia.org/wiki/Markdown

[9] Числа : http://callumacrae.github.com/regex-tuesday/challenge5.html

[10] IPv4 адреса : http://callumacrae.github.com/regex-tuesday/challenge6.html

[11] в википедии: https://ru.wikipedia.org/wiki/IPv4

[12] Доменные имена : http://callumacrae.github.com/regex-tuesday/challenge7.html

[13] Повторяющиеся пункты в списке MarkDown : http://callumacrae.github.com/regex-tuesday/challenge8.html

[14] Ссылки в MarkDown : http://callumacrae.github.com/regex-tuesday/challenge9.html

[15] Делим предложение на токены. : http://callumacrae.github.com/regex-tuesday/challenge0.html

[16] Буквы в алфавитном порядке. : http://callumacrae.github.com/regex-tuesday/challenge11.html

[17] Исправляем пробелы : http://callumacrae.github.com/regex-tuesday/challenge12.html

[18] Повторяющиеся слова друг под другом : http://callumacrae.github.com/regex-tuesday/challenge13.html

[19] Брутфорсим химические элементы: http://callumacrae.github.com/regex-tuesday/challenge14.html

[20] таблицы менделеева: http://ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%80%D0%B8%D0%BE%D0%B4%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D1%85%D0%B8%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85_%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2

[21] Музыкальные аккорды : http://callumacrae.github.com/regex-tuesday/challenge15.html

[22] неплохая статья об аккордах на русском: http://www.otsema.ru/accords/podvidi_akkordov.php

[23] на википедии, где используются соответствующие символы: http://en.wikipedia.org/wiki/Chord_names_and_symbols_(popular_music)#Examples

[24] Брутфорсим химические элементы : http://callumacrae.github.com/regex-tuesday/challenge16.html

[25] Регулярное выражение для регулярного выражения. : http://callumacrae.github.com/regex-tuesday/challenge17.html

[26] IRC — Сообщения : http://callumacrae.github.com/regex-tuesday/challenge18.html

[27] русскую версию спецификаци.: http://www.kvirc.ru/wiki/%D0%A1%D0%BF%D0%B5%D1%86%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F_IRC_%D0%BF%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB%D0%B0_(rfc1459)_%D0%BD%D0%B0_%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE%D0%BC_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B5#.D0.A4.D0.BE.D1.80.D0.BC.D0.B0.D1.82_.D1.81.D0.BE.D0.BE.D0.B1.D1.89.D0.B5.D0.BD.D0.B8.D1.8F_.D0.B2_.27.D0.BF.D1.81.D0.B5.D0.B2.D0.B4.D0.BE.27_BNF

[28] Источник: http://habrahabr.ru/post/167015/