- PVSM.RU - https://www.pvsm.ru -
Я хочу предложить вам поломать голову вечерок-другой над интересными задачками, на регулярные выражения, которые Callum Macrae выкладывает на своем сайте на GitHub [1] каждый Вторник.
Каждый вопрос представлен в виде набора тестов. Задача — написать такой регулярное выражение, чтобы все тесты стали зелеными.
Некоторые из задач сами по себе довольно простые, а самая интересная часть — в том, чтобы написать наиболее короткое возможное регулярное выражение.
Тесты используют JavaScript Regex движок вашего браузера, который обладает всеми основными возможностями PCRE. Подробнее можно посмотреть тут (англ.) [2], в колонке ECMA в таблице.
Я собрал в этой статье русские версии задач и материалов, которые могут помочь в их решении. Было бы интересно увидеть самые интересные решения в комментах.
Выделить тегом <strong> повторяющиеся слова.
Тhis is a test
=>this is <strong>is</strong> a
test.
Тhis is is a test
=>this is <strong>is</strong>
a test
Выбрать отенки серого в разных цветовых системах.
Почитать про цвета можно по этой ссылке [5].
#FFF
— Да
rgb(2.5, 2.5,2.5)
— Да
rgb(2, 4, 7)
— Нет
Выбрать существующие даты между 1000 и 2012 годом. Секунды могут быть опущены.
Автор облегчает задачу: в каждом месяце 30 дней.
2012/09/18 12:10
— Да
2013/09/09 09:09
— Нет (после 2012)
Преобразовать текст, обрамленный в звездочки, в курсив. Не трогать текст в двойных звездочках (жирный).
Почитать подробнее про MarkDown можно в википедии [8].
*this is italic*"
=><em>this is
italic</em>
**bold text (not italic)**
=>**bold text (not
italic)**
Выбрать числа с запятой или пробелом, в качестве разделителя разрядов. (к счастью обошлось без моммайе)
8,205,500.4672
— Да
1,5826,000
— Нет
Выбрать IPv4 адреса во всех возможных, представлениях: десятичном, шестнадцатеричном и восьмеричном. С точками и без. Подробнее про IP адреса можно узнать в википедии [11]
Примеры:
99.198.122.146
— Да
0xFF.255.0377.0x12
— Да
256.256.256.256
— Нет
Доменные имена для протоколов http и https, с необязательным слешем в конце. Специальые символы не используются.
Примеры:
http://example.com/
— Да
example.com
— Нет
кремль.рф
— Нет :(
Найти и выделить жирным (**) повтряющиеся пункты в 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**
Преобразовать 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())
Разбить предложение на токены. Это может быть полезно, например, для поисковой системы.
Есть несколько правил:
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.
Выбрать последовательность неповторяющихся символов в алфавитнои порядке.Пробелы нужно игнорировать. К сожалению известные мне решения не очень удачны.
abcdefghijk
— Да
abbc
— Нет
Убрать повторяющиеся пробелы и знаки табуляции, оставить по одному пробелу между словами и по два между предложениями.
Extra spaces
=>Extra spaces
Sentence. Sentence.
=>Sentence. Sentence.
Выбрать повторяющиеся слова, которые находятся непосредственно друг под другом.
Предполагается использование моноширинного шрифта. Строки длиннее 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.
— Нет
>Выбираем первые 50 химических элементов таблицы менделеева [20]. Решение довольно очевидное, поэтому задача — найти максимально короткое решение.
Примеры:
H
— Да
M
— Нет
Выбрать музыкальные аккорлы, например как Cmin, или Bmaj. Нужны и краткая и полная записи. Для данной задачи предпложим, что аккорды E♯, B♯, F♭ and C♭ не существует.
Для интересующихся есть неплохая статья об аккордах на русском [22] и английская статья на википедии, где используются соответствующие символы [23]
Так же обратите внимание, что диез (♯)
это не то же самое, что решетка (#).
C
— Да
Z
— Нет
Выбрать химические элементы с атомным числом больше 50.
I
— Да
A
— Нет
Выбрать правильно построенное регулярное выражение.Для начала ограничимся литералами (возможно экранированными), классами и несколькими квантификаторами.
/regexp?/
— Да
regex
— Нет
Выбрать правильно сформированное 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/
Нажмите здесь для печати.