Pull to refresh

Comments 69

некоторые бояться их как огня
Это про меня :)

Регулярок ужасно боюсь, а часто нужны… Спасибо большое, жду следующей части!
Есть хорошая книга «Дж. Фридл — Регулярные Выражения».
Поверьте, они не кусаются)
Причем перевод тоже очень хорош.
Прочитал когда-то эту книгу, после прочтения стало все на свои места.
Всем рекомендую)
Яростно подтверждаю. Ссался и боялся до уссачки. Яндекс выдал первым мануалом — Фридла. Сейчас я не знаю как я жил без регулярок — работа в шелле, скрипты, веб-скрипты — всё с регулярками.

Даже работа в блокноте и та — только с регулярками.
Одна из тех книг, которые каждый культурный айтишник обязан прочитать )
Книга великолепна, перевод великолепен!
Если с ними поработать на каком нибудь практическом примере, то они совсем и не такие страшные окажуться, а через некоторое время возникнет вопрос: «Как же я раньше без них обходился???».
парсер чужих страниц с совершенно разной семантикой и различными данными, которые нужно получить. HTML структурирован и идеально подходит не просто для тренировки в регулярных выражениях, но и поиска закономерностей и опорных точек для выделения нужного результирующего литерала
XPath для этого подходит гораздо лучше
мой пример — парсинг заранее заданных 100 страниц с выдёргиванием не только «нужных» ссылок, но и текста в них (а если не текст, но картинка — скачать её к себе) — всё это в условиях незакрытых тегов и т.д. XPath первым рассматривался, но не взлетело. Зато какой простор для упражнений с регулярками, ммм!
простор для творчества это хорошо и полезно, но не закрытые теги — это ЗЛО с которым нужно бороться!
Вебмастера, не закрывающие теги, совсем не думают о тех, кто ворует их контент.
UFO just landed and posted this here
Для .NET для этой цели есть HtmlAgilityPack. Субъективно — намного удобнее, чем регулярки. Хотя регулярные выражения я люблю.
Это был сферический пример в вакууме для освоения. Проект сдан и я могу вздохнуть :)
А в них нет ничего страшного :)
Если дойдут руки, то хочу поверхностно описать как устроены эти самые регэкспы внутри. Очень важно для понимания регэкспов в целом.
UFO just landed and posted this here
У Вас неплохо получается, тема интересная, ждем еще статей! По ходу чтения возникло несколько мелких замечаний, но я бы предпочел отправить их в личную почту (если Вам это интересно), а не озвучивать здесь.
Да, конечно интересно, отправляйте.
Кстати, среди языков, поддерживающих регулярки на уровне синтаксиса, есть и Groovy. Примеры:

def source = 'this is some string just string plain string'

// во-первых, есть спец. форма записи строки, в которой не требуется квотирование
word = /\w+/

// оператор ~ позволяет прекомпилировать объект паттерна (так же поддерживает подстановку подстрок)
wholePattern = ~/($word $word)*/

// это проверка (оператором ==~) что вся строка содержит только слова, разделенные пробелами.
assert source ==~ wholePattern

// А это матчинг, операторв =~ создает объект матчера. Проверяем, что данному паттерну сооттствует три подстроки
def finder = (source =~ "st..ng*")
assert finder.getCount() == 3
За такими языками даже из бразуера выходить не надо :) JavaScript
First you have a problem, and then you think: «I know, I'll use regular expressions». Now you've got two problems.

источника уже не вспомню, извините.
Вот именно поэтому я написал эту статью :)
Фридл вроде делит их на детерменированные и недетерменированные. Первые используются в программировании и поддерживают сохранение состояний, но за счет этого более медленные, а вторые быстрые, но только для поиска.
Да, я хочу об этом написать в следующих статьях подробно.
UFO just landed and posted this here
Конечно, я это и имел в виду, глупо парсить регэкспами TCP пакеты.
При работе с кириллицей используйте [А-Яа-яЁё] — а то на этом часто спотыкаются
Почему то у меня в PHP [А-Яа-яЁё] не работает — использую [\x7F-\xFF], а буква «ё» — остаётся для меня загадкой.
Всё зависит от кодировки кода и «испытуемого» текста
В общем совет новичкам — надо быть осторожней с кириллицей
У меня в Notepad++ для выражения [A-Я] не совпадает буква «Р». Вот такие вот фокусы.
Какие плагины для регулярок юзаешь?
Дамc, а у меня бука Х не работает :) Чудеса :)
При работе с кириллицой используйте юникод и модификатор \p. Не надо изобретать всякую фигню!
боян, но в тему:
если вы программист и решили решить проблему с помощью регулярных выражений — то теперь у вас ДВЕ проблемы!
а если не программист — то нет проблем :)
[\.\(\)\{\^]
Лишне так писать или нет, зависит исключительно от движка регулярных выражений.

Например, в движке Oniguruma выражение [a-w&&[^c-g]z] несёт вполне определённый смысл: диапазон c-g исключается из a-w. Так что символ «&» нужно экранировать. Таких расширений синтаксиса много.

В Perl6 регулярки вообще ни на что не похожи.
во! надо будет написать про регекспы в Perl6. только сначала справиться с собственным разрывом шаблона по этому поводу
Да, вы правы, поэтому я и начал с диалектов. Каждый раз надо смотреть как то сделано в конкретном языке или утилите.
Кстати! Вот мне приходилось сталкиваться с задачей нахождения НЕсовпадения части шаблона. Щас какой — нить синтетический пример придумаю…

Есть строки «Мама мыла раму» «Мама мыла папу» «Мама мыла мыло» «Мама мыла маму» и т.п. Они попадают под выражение "^Мама мыла (\w+)$"
А теперь мне понадобилось заматчить все строки, в которых мама моет все что угодно кроме рамы. Как? (Вариант с «заматчить „^Мама мыла раму$“ и выкинуть, а остальное пропустить» мне поему-то не подошел, не помню почему.)
Вроде это выделит «Мама мыла „+1 какой то любой символ, кроме р, а, м, у?
В таком варианте “^Мама мыла [^раму]+$» выделит «Мама мыла „+ что угодно, где нет символов р, а, м, у
Забыли заматчить «не раму». Negative lookahead совпадает (правильно, конечно, «не совпадает», то так можно мозг сломать) с позицией, а не подвыражением, соответственно захватится только «Мама мыла » в строке «Мама мыла Ваню».
Работает, спасибо!
PS: по ссылке нужно убрать и снова поставить галку на «g» чтобы заработало как ожидается.
Можно использовать поисковые конструкции чтобы исключить совпадение рамы.

Что-то типа ^Мама мыла (\w+)(?<! раму)$. Вторая часть (?! раму) говорит что в этой позиции подвыражение не должно совпадать назад (то что уже захватили в \w+). Но опять же надо понимать, что текст должен совпадать с НЕ рамой. В данном случае это не критично, потому что с \w идет квантификатор +, который требует хотя бы одной этой самой \w. Если бы стояла *, то были бы отличия в поведении.
Парсер наставил пробелов, но общий смысл должен быть понятен.
Спасибо, то что надо!
А поисковые конструкции совместимы с какими движками регулярных выражений? Меня интересуют Python, JS, PHP хотябы
Гуглите в сторону «negative lookahead» (как в примере Terion), либо «negative lookbehind» (как в моем) для своего языка. Обычно синтаксис этой части совпадает.
В джаваскрипте нет обратного поиска (lookbehind), а прямой есть.

В PHP есть всё.

Питона не знаю.
Всегда жутко завидовал тем, кто понимает регулярки. Я когда вижу эту кашу из символов, мой мозг отказывается работать и тактично уходит в сторону заката.
Читайте Фридля, просвещайтеся.
У меня нет цели изучить регулярки — я просто ужасаюсь им :-)
Как раз сегодня открыл Фридла, поэтому большая часть вещей показалась очевидной, хотя дошел только до 42 страницы. Но поясните пожалуйста, что такое «квотирование». Гуглил — не нашёл, или в книге это понятие дальше рассматривается?
По-видимому, Lattyf переводит словом «квотировать» англоязычный термин «escape», означающий в данном случае «предпринять усилия для устранения служебного смысла некоторого символа».

Например, символ точки («.») в регулярных выражениях имеет служебный смысл («найти на этом месте любой символ»). Поэтому, чтобы искать точку в буквальном смысле («найти на этом месте точку, только точку и ничего, кроме точки»), в регулярном выражении перед точкою надо поставить обратную косую черту («\.»).
Еще иногда «escaping» переводят как «экранирование».
Ну здесь автор имеет ввиду написание "\" перед метасимволом, чтобы метасимвол читался как обычный символ.

".jpg$" => ".jpg", «ajpg», «0jpg»
"\.jpg$" => ".jpg"
Выше уже пояснили, но хочу лобавить, что как раз один из тех терминов, для которого все переводы для непосвященного не очевидны.
Когда я первый раз увидел перевод «экранировать» тоже не смог сразу найти.
Объясните, пожалуйста, что означает «квотирование»? Это экранирование бэкслешем?
Да, Вы правы, это экранирование, escaping.
Sign up to leave a comment.

Articles

Change theme settings