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

в 3:37, , рубрики: challenge, javascript, regexp, regular expressions, Регулярные выражения, метки: , , ,

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

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js