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

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

Старая шутка: если у Вас есть проблема и Вы хотите решить ее при помощи регулярных выражений, то у Вас уже две проблемы.
А я вас опередила, эта шутка есть в статье! :)
Отличная статья, отличные слайды и отличное чувство юмора (нам нравится одна и таже шутка) — спасибо! Таки да статью не читал, но о̶с̶у̶ж̶д̶а̶ю̶ одобряю!
Сюда же: когда у вас в руках молоток, всё вокруг начинает казаться гвоздями )
Сразу видно, кто статью читал :) Эта шутка там есть :)
и найти ее можно было даже без регулярок :)
Большое спасибо, очень полезная статья.
Не за что ^_^
Картиночки — милота. Прямо очень помогает читать. Потому что про регулярки статей немало, но вот эту действительно просмотрел до конца. За дидактику 5 с плюсом. Это шедевр.

Спасибо большое за такой фидбек, очень приятно))
НЛО прилетело и опубликовало эту надпись здесь
Спасибо))

Простите, но я всё-таки напишу, не для хейта, а просто для понимания, несколько люди разные.


Я бы никогда и нигде не хотел встретить документацию или обучающий материал, написанный в подобном стиле!


Первое — это картинки. Я люблю, когда картинки иллюстрируют текст и помогают в нём разобраться, но здесь они настолько выбиваются из контекста и отвлекают… игнорировать их не получается — большие и яркие, смысла в них особо нет, помощи тоже. Скорее они несут развлекательную функцию, которая мне мешала бы понимать текст.


Второе — это дикое количество текста для примитивных случаев. Например, в самом конце статьи:


RegEx: Ольга
Замена: Макар
Текст был: Привет, Ольга!
Текст стал: Привет, Макар!

Вот такой пример плюс картинка уже занимает один экран моего телефона. Это просто выматывает при чтении. Более того, воды в тексте столько, что первую треть, наверное, статьи можно заменить парой абзацев.


Для меня это показатель крайне низкого качества материала. Выучить что-то по такой штуке будет сложно — максимум, составить общее представление и использовать потом как постоянную шпаргалку.


На этом фоне фактические ошибки вроде экранирования закрывающей квадратной скобки "]" или "$matches[1] в php вместо \1" даже как-то и неважны уже.


Просто документацией Mozilla, например, можно пользоваться, а этой статьей — нет.


Впрочем, судя по комментам выше, кому-то нравится и такой стиль. Удивительно, но факт)

Ну, для вас показатель низкого качества, а для кого-то высокого. Вы правы, люди разные. Это мой стиль, остальные статьи такие же :)
Мне кажется, это полезно, когда вообще ничего не понимаешь в теме. До сих пор помню свою первую книжку по теорверу — в ней тоже были картинки, шутки-прибаутки, чуть ли не комиксы. Как справочник она никуда не годилась бы — но после ее прочтения, годами позднее, на первую лекцию я пришел, уже владея базовыми понятиями, и это сильно помогало. А строгий учебник по теорверу я едва ли осилил, а скорее даже пытаться не стал бы.
Не знаю, я вот «Что такое SQL» серии Head First прочитала, уже зная почти всё, что там было описано. Всё равно понравилось, люблю эту серию)
Миллениалы узнали про регулярные выражения.
Видите, как круто!
Возможно Вы промахнулись с эпохой? может зумеры?
Да, \b — это граница слова, а backspace обозначается чуть по-другому, с квадратными скобками
Ну вот… После таких статей уже не получится по умолчанию считать, что больше никто в здании не разбирается в регэкспах :) -17 к классовому навыку «Высокомерный взгляд» и +1 в карму автору :)
Спасибо))
Спасибо за статью
Не за что)
Что с производительностью регулярок? Целесообразно ли не использовать регулярки и делать парсинг строк вручную?

КМК как и на все такие вопросы ответ: что зависит от конкретной реализации и в каждом случае нужно взвешивать все "за" и "против".

Зависит от сложности паркинга. Простое что-то можно и вручную. Сложное вы отлаживать дольше будете, чем регулярки выучите
Для своих нужд использовал Ragel. +100500 к гибкости, и по скорости также отлично.
НЛО прилетело и опубликовало эту надпись здесь
По правде говоря думая о Ragel я представлял в уме BNF, нежели стандартные регулярки. Не могу понять пока уместно ли говорить о DFA/NFA в контексте Ragel. Задумался, пошел читать Википедию.

Все нормально у регулярок с производительностью.
И вообще, не нужно на пустом месте озабачиваться "производительностью".
Инструмент надо выбирать по задаче, а не воображаемым проблемам с производительностью. Если проблема решается регуляркой, то надо использовать регулярку. Если регулярка не нужно — то и не использовать. Просто потому что не нужна, а не потому что "непроизводительно".


Надо запомнить одно простое правило — проблемы с производительностью начинаются тогда, когда твой код пытается обработать неадекватно большой объем данных. Для решения проблемы надо этот объем сократить. А вопрос "какую функцию использовать" не имеет никакого отношения к производительности.

Старая шутка: регулярки ищут то, что вы написали, а не то, что хотели написать
Хорошая шутка))
Есть такой феномен — эффект Флинна, когда IQ человечества рос ежегодно и это наблюдали в течение 20 века. А с 1990х годов тенденция к росту прекратилась и начался обратный процесс. Что мы стали повсеместно наблюдать, например, по таким статьям. Идиократия не за горами.
НЛО прилетело и опубликовало эту надпись здесь

Телевизор появился у всех?

Тоже писал на эту тему статью на Хабре. Может быть кому-то будет интересно почитать и ее тоже в дополнение: habr.com/ru/company/badoo/blog/343310
Тоже неплохо ^_^

Картинки и подача прикольные. Такая статья про регулярки имеет право на существование, даже несмотря на то, что про них уже всё давно написано)


А вот задачу вы выбрали, конечно, ту ещё. Написать корректную регулярку для поиска дат — это уже прям уровень уверенного владения. Поэтому в статье вы не добрались до проверки дней в конкретном месяце, високосных годов и ограничились двумя столетиями :-)

Спасибо)) Да да, если еще дни в конкретном месяце проверять, регулярка получится ууууу, закачаешься! :)
Хорошо что даты принудительно формируюся и нет типа 1.3.21 или более логичного 21.3.1 :)
Regex: test{2}
Найдет: testt
Не найдет: testtest

Он найдет «testt» в «testtest», поэтому пример не самый удачный.
Упс, тут вы правы ))) Будет тест на внимательность! Ну или чуть позже переделаю))
НЛО прилетело и опубликовало эту надпись здесь
Я рекомендую только то, что сама прочитала. Эту не читала, для этого есть комментарии, чтобы люди могли своим любимым тоже поделиться)
НЛО прилетело и опубликовало эту надпись здесь
Спасибо, добавлю себе в туду )) Она только в англ варианте есть?
НЛО прилетело и опубликовало эту надпись здесь
Предупрежу только, что на русском языке отвратное издание — там опечатка на опечатке в том числе в самих регулярках.
НЛО прилетело и опубликовало эту надпись здесь
Онлайн-инструмент, заточенный под Пайтон — pythex.org
Да да, если еще дни в конкретном месяце проверять, ...

Во всяком деле надо знать меру. Так и в регулярках. Пишу на perl уже 20 лет.
Чтобы дни проверять в регулярку можно вставить вызов функции.
Полностью согласна про меру))
Парсинг даты регулярками — задача надуманая чуть менее, чем парсинг ими html/xml. Зато знание стандартной библиотеки избавляет от многих страданий. Python:
import re
from datetime import date

def parce_date(s: str) -> date:
    try:
        return date.fromisoformat(
            re.sub(r'^(\d\d)\.(\d\d)\.(\d{4})$', r'\3-\2-\1', s))
    except ValueError as e:
        raise e  # тут пишем обработчик, какой хотим

print(parce_date('05.08.2015')) #  ok
print(parce_date('99.99.2000')) #  error
Я бы дополнил статью пояснением, когда не следует применять регулярки: «Если у вас не получается за 5/10/15 минут решить вашу задачу с помощью регулярки, решайте её иным способом. Если это, конечно, не учебный процесс — тогда идите до конца )»
Ну нет, люди то разные )) Кто-то сделает одну задачку за 5 минут, а кто-то за 35. И вовсе не потому, что выбрал плохой метод))) Так что это пояснение такое себе) Но вообще оно больше для разработчиков, имхо, а моя основная целевая аудитория — тестировщики)))
Кто-то сделает одну задачку за 5 минут, а кто-то за 35.
Если это, конечно, не учебный процесс — тогда идите до конца )
Не вижу противоречия — учиться можно до полного просветления, а решать рабочие проблемы желательно в срок. В императивном стиле почти всякий джун что-нибудь да изобразит, а в декларативном может и застрять. Я вот об этом.
Спасибо за статью! Рекомендую своим студентам для ознакомления с регулярками.
Не за что! )
Атрибут BACKGROUND-COLOR не сработал, поэтому я буду дублировать регулярки текстом (чтобы можно было скопировать себе) и рисунком, чтобы показать, что именно regex нашел:

Для того чтобы вставить текст со своим HTML оформлением как изображение можно использовать как контейнер SVG с элементом foreignObject. Я этот метод использовал в статье "Горизонтальный блог".


Пример


  1. Вставляем html в SVG
    Имя файла: html-in-svg.svg


    <svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%">
    <foreignObject x="0" y="0" width="100%" height="100%" requiredExtensions="http://www.w3.org/1999/xhtml">
        <html xmlns="http://www.w3.org/1999/xhtml">
            <p><strong>Текст</strong>: Море, море, море, океан</p>
            <p><strong>Regex</strong>: море</p>
            <p><strong>Найдет</strong>: Море, <mark>море</mark>, море, океан</p>
        </html>
    </foreignObject>
    </svg>

  2. Файл необходимо загрузить на хостинг который принимает SVG изображения и отдаёт их напрямую.


  3. Вставляем SVG изображение в статью например так:
    Markdown:


    ![Текст: Море, море, море, океан
    Regex: море
    Найдет: Море, море, море, океан](https://gateway.ipfs.io/ipfs/bafkreidtapjgkapdgewe2wogb3dhsblgk5osz7fkm4yjvhzqqzcb5voa2e)

    HTML:


    <img src="https://gateway.ipfs.io/ipfs/bafkreidtapjgkapdgewe2wogb3dhsblgk5osz7fkm4yjvhzqqzcb5voa2e" alt="Текст: Море, море, море, океан
    Regex: море
    Найдет: Море, море, море, океан"/>


Результат:
Текст: Море, море, море, океан
Regex: море
Найдет: Море, море, море, океан

О, вот за это спасибо большое! Буду знать)
Спасибо огромное!
Статья — супер просто!
Спасибо)

В какой-то момент мне показалось, что в одном из примеров вы ошибочно поставили прямой слеш вместо обратного. Но он вроде был какой-то не совсем прямой. В общем, из-за того, что эта строка набрана курсивом, айфон отображает её практически с прямыми слешами.

Может вы поправите в статье, так как курсив там всё равно не нужен.

Пишу сюда, а не в личку, т.к. картинку прикрутить можно только тут, а без картинки я не объясню.

Картинка

Не увидела большой разницы, но курсив сняла)

Ага, спасибо. Стало хорошо, можно изучать дальше. :)

Спасибо за статью.

Вот разница ещё более наглядно.

Правильно ли я понимаю, что Regex на особо предназначен для поиска вида: «первые три символа пятой строки»? 

Есть простой способ взять пятую строку? Или пятьсот пятую? 

Или трехсот первое слово?

Да, в линуксах это можно простым sed-ом, cut-ом и прочими утилитами найти, без регулярок

Информативно, забавно, наглядно.

Спасибо)

Именованные группы - весьма полезно для регэкса как унифицированного АПИ

let dateRegexp = /(?<year>[0-9]{4})-(?<month>[0-9]{2})-(?<day>[0-9]{2})/;
let str = "2019-04-30";

let groups = str.match(dateRegexp).groups;

alert(groups.year); // 2019
alert(groups.month); // 04
alert(groups.day); // 30

Не пойму, как в исключения добавить все буквы, цифры и знак минус. С буквамии цифрами все понятно [^a-zA-Z0-9_] А вот как туда еще и знак минуса добавить?

Экранировать? \-

Последним в списке

[^a-zA-Z0-9_-]

На мой взгляд, лучше всё-таки экранировать. В рамках скобок символ "-" может являться разделителем диапазона, т.е. спецсимволом. И в представленном выражении уже дважды используется именно в этой роли. Когда есть экран — всё сразу понятно, никакой двусмысленности.

Как угодно :-) Я показал как можно, а не как нужно. На вкус и цвет, как говорится

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

Публикации