Комментарии 41
Черт. Лютая убийца времени. Автор, гореть тебе в аду.
Взявшись за решение этих задачек, я понял что совсем ничего не смыслю в регулярных выражениях :)
Для большинства задач — согласен. Прошу решивших помаленьку публиковать сюда их ответы, желательно с обоснованием или хотя-бы ходом размышлений при решении.
В первой задаче необходимо ссылаться на найденный ранее паттерн. По-моему, сложность была в обработке окружающих символов (просмотр вперёд/назад).
можно улучшить решение
можно улучшить решение
Первая. Проблема в обработке начал/концов.
/(^|\W)(['\w]+)\s(\2)\b/gi
$1$2 <strong>$3</strong>
/\b(['\w]+) (\1)\b/gi
$1 <strong>$2</strong>
Пробел
первая задача: решение получилось один-в-один с вашим;
а вот во второй задаче всё гораздо печальней, особенно с разделением rgb/rgba, hsl/hsla — можно ли обойтись без копи-паста? — у меня не получилось :'-(
Вот моё решение второй задачи (нужно только реплейснуть в текстовом редакторе (^\s*|\n) на «ничто»):
а вот во второй задаче всё гораздо печальней, особенно с разделением rgb/rgba, hsl/hsla — можно ли обойтись без копи-паста? — у меня не получилось :'-(
Вот моё решение второй задачи (нужно только реплейснуть в текстовом редакторе (^\s*|\n) на «ничто»):
/^
(?:
#([\da-f]{1,2})\1\1
|
rgb\(
\s*0*
(
(?:
1?\d?\d
|
2[0-4]\d
|
25[0-5]
)
(?:\.\d+)?
%?
),
\s*0*
\2,
\s*0*
\2
\s*
\)
|
rgba\(
\s*0*
(
(?:
1?\d?\d
|
2[0-4]\d
|
25[0-5]
)
(?:\.\d+)?
%?
),
\s*0*
\3,
\s*0*
\3,
\s*0*
\d+(?:\.\d+)?%?
\s*
\)
|
hsl\(
\s*0*
\d+(?:\.\d+)?,
\s*0*
(?:
0%,
\s*0*
\d+(?:\.\d+)?%
|
\d+(?:\.\d+)?%,
\s*0*
(?:0|100)%
)
\s*
\)
|
hsla\(
\s*0*
\d+(?:\.\d+)?,
\s*0*
(?:
0%,
\s*0*
\d+(?:\.\d+)?%
|
\d+(?:\.\d+)?%,
\s*0*
(?:0|100)%
),
\s*0*
\d+(?:\.\d+)?%?
\s*
\)
)
$/i
/^(1\d{3}|20(0\d|1[0-2]))\/(0[1-9]|1[0-2])\/(0[1-9]|[1-2]\d|30) ([0-1]\d|2[0-3]):[0-5]\d(:[0-5]\d)?$/i
теперь сижу и думаю… зачем я это сделал?
теперь сижу и думаю… зачем я это сделал?
Быть может, это самое индусское регулярное выражение, что вы видели в своей жизни, но тем не менее, мои мучения не были напрасны, и одно из заданий я таки выполнил. (задача №3)
Задача №1.
Вторую не осилил :(
Задача №3. Если кто знает решение лучше — напишите, плиз.
Задача №4. Там, по-идее, надо вместо подмаски
Задача №5.
Вторую не осилил :(
Задача №3. Если кто знает решение лучше — напишите, плиз.
Задача №4. Там, по-идее, надо вместо подмаски
(^|[^*])
писать утверждение (?<!\*)
, но оно не срабатывает. Не понял почему.Задача №5.
По поводу 4-ой, сам на это наткнулся. Негативная ретроспективная проверка далеко не везде поддерживается.
Задача №7. На домен первого уровня, обычно, более суровые ограничения накладывают нежели
Задача №8.
Задача №9.
Задача №12.
Задача №15.
Задача №17.
[a-z\d]{1,6}
(длинные домены типа travel, info, museum просто через | перечисляют)…Задача №8.
Задача №9.
Задача №12.
Задача №15.
Задача №17.
Задача №18. Костыльненько как-то получилось… видимо, надо описание протокола копать, чтоб понять как там что положено.
№5 /^\d{1,3}([, ]\d{3})*([.,]\d+)?$/.test('1,000,9') = true
Хотя число 1,000,9 некорректно — там надо разделять форматы на два отдельных выражения:
либо разряды разделяет запятая — тогда дробная часть отделяется точкой,
либо разряды — пробел, дробная часть — запятой.
Хотя число 1,000,9 некорректно — там надо разделять форматы на два отдельных выражения:
либо разряды разделяет запятая — тогда дробная часть отделяется точкой,
либо разряды — пробел, дробная часть — запятой.
В целом, согласен. Но автор челленджа упростил задачу, а то получится, что и 30 февраля не должно попадать
Я сначала так и строил регулярку, с учетом высокосных лет. Но потом все же решил не настолько углубляться, а то уж совсем встремная регулярка получалась. Ну а месяцев где 31 день все же намного больше чем 30.
Вообще все эти тесты по хорошему бы генерить каждый раз разные, как в спортивном программировании, так было бы честнее
Вообще все эти тесты по хорошему бы генерить каждый раз разные, как в спортивном программировании, так было бы честнее
Более короткое решение задачи №1
«Если у вас была одна проблема, и вы решили использовать регулярные выражения, то теперь у вас есть две проблемы» :)
Автору спасибо за полезную информацию, разомнем мозг.
Автору спасибо за полезную информацию, разомнем мозг.
Костылеобразное решение задачи №7
Странноватое решение задачи №11 (Если у кого-то есть идеи как проще — напишите пожалуйста)
Разбирать число «4294967295» рег.вырами бред конечно полный — это не их задача. Составитель заданий, смотрю, знатный извращенец.
В данном случае следовало бы определить число ли это, например так: "/^\d+$/". Если RE-тест пройден, то дальше идёт парсинг числа, и определение больше ли константы 4294967295.
В данном случае следовало бы определить число ли это, например так: "/^\d+$/". Если RE-тест пройден, то дальше идёт парсинг числа, и определение больше ли константы 4294967295.
По аналогии с сайтом sql-ex.ru/ кто-нибудь может сделает выдачу сертификатов?
Блин, дошел до 9ого, решил посмотреть сколько их всего там :(( Я думал 10. Мотивация испарилась
Чего зря пропадать.. Хвастаюсь. (решения)
Challenge 1 — выделить повторяющиеся слова — 25 + 22 символа
Challenge 2 — матчить серый цвет в куче форматов — 412 символов
Challenge 3 — матчить дату-время — 146 символов
Challenge 4 — *курсив* — 36 + 13 символов
Challenge 5 — матчить форматированные числа — 54 символа
Challenge 6 — матчить IPv4-адреса в куче форматов (АД) — 519 символов
Challenge 7 — матчить домены с http/https — 94 символа
Challenge 8 — отмечать повторяющиеся элементы списка — 37 + 16 символов
Challenge 9 — применять синтаксис разметки для ссылок — 124 + 23 символа (пригодился регексп из задания про домены)
P.S. Еще хвастаюсь: на 9 первых ушло 1,5 часа \m/
Challenge 2 — матчить серый цвет в куче форматов — 412 символов
Challenge 3 — матчить дату-время — 146 символов
Challenge 4 — *курсив* — 36 + 13 символов
Challenge 5 — матчить форматированные числа — 54 символа
Challenge 6 — матчить IPv4-адреса в куче форматов (АД) — 519 символов
Challenge 7 — матчить домены с http/https — 94 символа
Challenge 8 — отмечать повторяющиеся элементы списка — 37 + 16 символов
Challenge 9 — применять синтаксис разметки для ссылок — 124 + 23 символа (пригодился регексп из задания про домены)
P.S. Еще хвастаюсь: на 9 первых ушло 1,5 часа \m/
О, снова стал публиковать. Спасибо автору статьи.
допустим, что это решение (2 задача)
Беру его тесты, беру сторонний матчер (или руками прямо в js) — совпадения. А на сайте — нет. Не понимаю почему. Никто не подскажет?
Беру его тесты, беру сторонний матчер (или руками прямо в js) — совпадения. А на сайте — нет. Не понимаю почему. Никто не подскажет?
Все тесты должны быть зеленые.
Если написано «no match», значит, что это не должно совпадать. У вас совпадает, поэтому и ошибка.
Если написано «no match», значит, что это не должно совпадать. У вас совпадает, поэтому и ошибка.
там где «no match» как раз таки не должно быть совпадений.
по вашей логике, регулярка
по вашей логике, регулярка
'#ef4'.match(/(.+?)/i)
должна подходить под ответ задачи )Не хватает чего-то в таком духе:
a...ab...bc...c, где a, b и с встречаются одинаковое количество раз.
Или вариант покруче:
aabcacbcb… с тем же условием
a...ab...bc...c, где a, b и с встречаются одинаковое количество раз.
Или вариант покруче:
aabcacbcb… с тем же условием
Посмотрел сколько смог. В целом то все не столько сложно, сколько нудно. На первые два убил час утром, конкретно под тесты реги не затачивал, но и более общий случай, чем те что даны в тестах тоже не рассматривал. Получил:
1.
Рега:
Замена:
2.
Рега:
Для разминки мозгов неплохо, главное, чтобы кто-то не додумался на собеседованиях такое задавать, особенно на бумажке ;)
1.
Рега:
/\b(\S+) (\1)\b/gi
Замена:
$1 <strong>$2</strong>
2.
Рега:
/#([\da-f]{1,2})\1\1$|\brgb\((\d+\.\d+|\d\d?|1\d\d|2[0-4]\d|25[0-5])(%?),\s*0*\2\3,\s*0*\2\3\)|rgba\(([\d.]+)(%?),\s*0*\4\5,\s*0*\4\5,|hsla?\([\.\d]+%?,\s*(0%?,\s*[.\d]+%?|[.\d]+%?,\s*(0|100)%?)(,\s*[.\d]+)?\)/i
Для разминки мозгов неплохо, главное, чтобы кто-то не додумался на собеседованиях такое задавать, особенно на бумажке ;)
3.
Честно говоря, это использование регулярок, ради использования регулярок, причем там, где в реальных условиях используются совсем другие средства. Но, что не говори, мозги разминает.
Кстати, кто просил ход рассуждений? Рассуждения, например, в этом случае (задании №3) весьма банальны:
Нужен год от 1000 до 2012, это означает, что подходит любой 4х-значный год начинающийся на «1» (1000-1999), т.е: 1\d\d\d или 1\d{3}, также подходит 2000-2009, т.е. 200\d, и 2010-2012, т.е. 201[012]. Таким образом рега, под которую попадут все нужные года выглядит: (1\d{3}|200\d|201[012]) и принципиально по другому это условие с помощью регулярок не запишешь.Похожие размышления для месяца, дня, часа, минут.
Например минуты и секунды бывают от 00 до 59, т.е. первая цифра 0-5, а вторая любая, записывается это [0-5]\d. Для секунд то же самое, но они опциональны по условию.
/^(1\d{3}|200\d|201[012])\/(0[1-9]|1[012])\/(0[1-9]|[12]\d|30)\s+(0\d|1\d|2[0-3]):[0-5]\d(:[0-5]\d)?$/
Честно говоря, это использование регулярок, ради использования регулярок, причем там, где в реальных условиях используются совсем другие средства. Но, что не говори, мозги разминает.
Кстати, кто просил ход рассуждений? Рассуждения, например, в этом случае (задании №3) весьма банальны:
Нужен год от 1000 до 2012, это означает, что подходит любой 4х-значный год начинающийся на «1» (1000-1999), т.е: 1\d\d\d или 1\d{3}, также подходит 2000-2009, т.е. 200\d, и 2010-2012, т.е. 201[012]. Таким образом рега, под которую попадут все нужные года выглядит: (1\d{3}|200\d|201[012]) и принципиально по другому это условие с помощью регулярок не запишешь.Похожие размышления для месяца, дня, часа, минут.
Например минуты и секунды бывают от 00 до 59, т.е. первая цифра 0-5, а вторая любая, записывается это [0-5]\d. Для секунд то же самое, но они опциональны по условию.
Меня скоро уволят из-за этих challeng-ей.
Вот первое задание:
Второе не могу понять hsl и hsla. Почему:
hsl(20,0%, 50%) — match
hsl(0, 10%, 100%) — match
hsl(0.5, 10.5%, 0%) — match
hsl(5, 5%, 0%) — match
hsla(20, 0%, 50%, 0.88) — match
hsla(0, 0%, 0%, 0.25) — match
a
hsl(20, 20%, 20%) — no match
hsl(0, 1%, 01%) — no match
hsl (20,0%, 50%) — no match
hsla(0, 10%, 50%, 0.5) — no match
Подскажите, пожалуйста, по какому алгоритму вычисляется grayscale цвет в этих двух??
Третье задание —
Вот первое задание:
/\b(\S+)\s+(\1)\b/gi ---> $1 <strong>$2</strong>
Второе не могу понять hsl и hsla. Почему:
hsl(20,0%, 50%) — match
hsl(0, 10%, 100%) — match
hsl(0.5, 10.5%, 0%) — match
hsl(5, 5%, 0%) — match
hsla(20, 0%, 50%, 0.88) — match
hsla(0, 0%, 0%, 0.25) — match
a
hsl(20, 20%, 20%) — no match
hsl(0, 1%, 01%) — no match
hsl (20,0%, 50%) — no match
hsla(0, 10%, 50%, 0.5) — no match
Подскажите, пожалуйста, по какому алгоритму вычисляется grayscale цвет в этих двух??
Третье задание —
/^(1\d+|20(0\d|1[0-2]))/(0[1-9]|1[0-2])/(0[1-9]|[1-2]\d|30) ([0-1]\d|2[0-3]):[0-5]\d:?([0-5]\d)?$/
Жаль репозиторий сдох.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Разминаем мозг регулярными выражениями — Regex Tuesday Challenge