Pull to refresh

Comments 76

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

Спасибо большое за такой фидбек, очень приятно))
UFO just landed and posted this here

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


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


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


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


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

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


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


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


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


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

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

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

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

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


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

Старая шутка: регулярки ищут то, что вы написали, а не то, что хотели написать
Есть такой феномен — эффект Флинна, когда IQ человечества рос ежегодно и это наблюдали в течение 20 века. А с 1990х годов тенденция к росту прекратилась и начался обратный процесс. Что мы стали повсеместно наблюдать, например, по таким статьям. Идиократия не за горами.
UFO just landed and posted this here

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

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


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

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

Он найдет «testt» в «testtest», поэтому пример не самый удачный.
Упс, тут вы правы ))) Будет тест на внимательность! Ну или чуть позже переделаю))
UFO just landed and posted this here
Я рекомендую только то, что сама прочитала. Эту не читала, для этого есть комментарии, чтобы люди могли своим любимым тоже поделиться)
UFO just landed and posted this here
Спасибо, добавлю себе в туду )) Она только в англ варианте есть?
UFO just landed and posted this here
Предупрежу только, что на русском языке отвратное издание — там опечатка на опечатке в том числе в самих регулярках.
UFO just landed and posted this here
Онлайн-инструмент, заточенный под Пайтон — 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_-]

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

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

Sign up to leave a comment.

Articles