Pull to refresh

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

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

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

Тесты используют 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)
Главное не перепутать с картинками: ![alt text](image location)

Примеры:
[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!Нет
Tags:
Hubs:
Total votes 71: ↑70 and ↓1 +69
Views 60K
Comments Comments 40