Как стать автором
Обновить

Комментарии 41

Черт. Лютая убийца времени. Автор, гореть тебе в аду.
Взявшись за решение этих задачек, я понял что совсем ничего не смыслю в регулярных выражениях :)
Для большинства задач — согласен. Прошу решивших помаленьку публиковать сюда их ответы, желательно с обоснованием или хотя-бы ходом размышлений при решении.
В первой задаче необходимо ссылаться на найденный ранее паттерн. По-моему, сложность была в обработке окружающих символов (просмотр вперёд/назад).
можно улучшить решение
Пробел
Ну у вас тоже любой пробельный символ на пробел заменяется.
Как на счет
/(\b\S+\b)(\s+)(\1\b)/ig
$1$2<strong>$3</strong>
первая задача: решение получилось один-в-один с вашим;

а вот во второй задаче всё гораздо печальней, особенно с разделением 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)
^(?!a)

костыль под конкретную задачу? :)
что-то вроде того :)
в любом случае, моё решение и рядом не стоит с решением RemRyahirev, так что мне здесь ещё есть чему учиться.
По поводу 4-ой, сам на это наткнулся. Негативная ретроспективная проверка далеко не везде поддерживается.
Задача №7. На домен первого уровня, обычно, более суровые ограничения накладывают нежели [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 некорректно — там надо разделять форматы на два отдельных выражения:
либо разряды разделяет запятая — тогда дробная часть отделяется точкой,
либо разряды — пробел, дробная часть — запятой.
Задача №3 чуть покороче.
А еще в вашей регулярке ошибка, вы не матчите 31 день. В тестах такой даты не было но все же
В целом, согласен. Но автор челленджа упростил задачу, а то получится, что и 30 февраля не должно попадать
Я сначала так и строил регулярку, с учетом высокосных лет. Но потом все же решил не настолько углубляться, а то уж совсем встремная регулярка получалась. Ну а месяцев где 31 день все же намного больше чем 30.
Вообще все эти тесты по хорошему бы генерить каждый раз разные, как в спортивном программировании, так было бы честнее
«Если у вас была одна проблема, и вы решили использовать регулярные выражения, то теперь у вас есть две проблемы» :)

Автору спасибо за полезную информацию, разомнем мозг.
Странноватое решение задачи №11 (Если у кого-то есть идеи как проще — напишите пожалуйста)
Разбирать число «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/
О, снова стал публиковать. Спасибо автору статьи.
допустим, что это решение (2 задача)

Беру его тесты, беру сторонний матчер (или руками прямо в js) — совпадения. А на сайте — нет. Не понимаю почему. Никто не подскажет?
Все тесты должны быть зеленые.

Если написано «no match», значит, что это не должно совпадать. У вас совпадает, поэтому и ошибка.
Ах вот в чём дело, теперь понятно. Спасибо! :)
там где «no match» как раз таки не должно быть совпадений.

по вашей логике, регулярка '#ef4'.match(/(.+?)/i) должна подходить под ответ задачи )
Не хватает чего-то в таком духе:
a...ab...bc...c, где a, b и с встречаются одинаковое количество раз.
Или вариант покруче:
aabcacbcb… с тем же условием
Посмотрел сколько смог. В целом то все не столько сложно, сколько нудно. На первые два убил час утром, конкретно под тесты реги не затачивал, но и более общий случай, чем те что даны в тестах тоже не рассматривал. Получил:

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.
/^(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-ей.
Вот первое задание:
/\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)?$/

Жаль репозиторий сдох.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории