Комментарии 69
некоторые бояться их как огня
Это про меня :)
Регулярок ужасно боюсь, а часто нужны… Спасибо большое, жду следующей части!
Это про меня :)
Регулярок ужасно боюсь, а часто нужны… Спасибо большое, жду следующей части!
Есть хорошая книга «Дж. Фридл — Регулярные Выражения».
Поверьте, они не кусаются)
Поверьте, они не кусаются)
Причем перевод тоже очень хорош.
Прочитал когда-то эту книгу, после прочтения стало все на свои места.
Всем рекомендую)
Всем рекомендую)
Одна из тех книг, которые каждый культурный айтишник обязан прочитать )
Книга великолепна, перевод великолепен!
Книга великолепна, перевод великолепен!
Если с ними поработать на каком нибудь практическом примере, то они совсем и не такие страшные окажуться, а через некоторое время возникнет вопрос: «Как же я раньше без них обходился???».
парсер чужих страниц с совершенно разной семантикой и различными данными, которые нужно получить. HTML структурирован и идеально подходит не просто для тренировки в регулярных выражениях, но и поиска закономерностей и опорных точек для выделения нужного результирующего литерала
XPath для этого подходит гораздо лучше
мой пример — парсинг заранее заданных 100 страниц с выдёргиванием не только «нужных» ссылок, но и текста в них (а если не текст, но картинка — скачать её к себе) — всё это в условиях незакрытых тегов и т.д. XPath первым рассматривался, но не взлетело. Зато какой простор для упражнений с регулярками, ммм!
Для .NET для этой цели есть HtmlAgilityPack. Субъективно — намного удобнее, чем регулярки. Хотя регулярные выражения я люблю.
Это был сферический пример в вакууме для освоения. Проект сдан и я могу вздохнуть :)
А в них нет ничего страшного :)
Если дойдут руки, то хочу поверхностно описать как устроены эти самые регэкспы внутри. Очень важно для понимания регэкспов в целом.
Если дойдут руки, то хочу поверхностно описать как устроены эти самые регэкспы внутри. Очень важно для понимания регэкспов в целом.
У Вас неплохо получается, тема интересная, ждем еще статей! По ходу чтения возникло несколько мелких замечаний, но я бы предпочел отправить их в личную почту (если Вам это интересно), а не озвучивать здесь.
Кстати, среди языков, поддерживающих регулярки на уровне синтаксиса, есть и 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
First you have a problem, and then you think: «I know, I'll use regular expressions». Now you've got two problems.
источника уже не вспомню, извините.
Фридл вроде делит их на детерменированные и недетерменированные. Первые используются в программировании и поддерживают сохранение состояний, но за счет этого более медленные, а вторые быстрые, но только для поиска.
НЛО прилетело и опубликовало эту надпись здесь
При работе с кириллицей используйте [А-Яа-яЁё] — а то на этом часто спотыкаются
Почему то у меня в PHP [А-Яа-яЁё] не работает — использую [\x7F-\xFF], а буква «ё» — остаётся для меня загадкой.
У меня в Notepad++ для выражения [A-Я] не совпадает буква «Р». Вот такие вот фокусы.
Дамc, а у меня бука Х не работает :) Чудеса :)
При работе с кириллицой используйте юникод и модификатор \p. Не надо изобретать всякую фигню!
боян, но в тему:
если вы программист и решили решить проблему с помощью регулярных выражений — то теперь у вас ДВЕ проблемы!
если вы программист и решили решить проблему с помощью регулярных выражений — то теперь у вас ДВЕ проблемы!
[\.\(\)\{\^]Лишне так писать или нет, зависит исключительно от движка регулярных выражений.
Например, в движке Oniguruma выражение [a-w&&[^c-g]z] несёт вполне определённый смысл: диапазон c-g исключается из a-w. Так что символ «&» нужно экранировать. Таких расширений синтаксиса много.
В Perl6 регулярки вообще ни на что не похожи.
Кстати! Вот мне приходилось сталкиваться с задачей нахождения НЕсовпадения части шаблона. Щас какой — нить синтетический пример придумаю…
Есть строки «Мама мыла раму» «Мама мыла папу» «Мама мыла мыло» «Мама мыла маму» и т.п. Они попадают под выражение "^Мама мыла (\w+)$"
А теперь мне понадобилось заматчить все строки, в которых мама моет все что угодно кроме рамы. Как? (Вариант с «заматчить „^Мама мыла раму$“ и выкинуть, а остальное пропустить» мне поему-то не подошел, не помню почему.)
Есть строки «Мама мыла раму» «Мама мыла папу» «Мама мыла мыло» «Мама мыла маму» и т.п. Они попадают под выражение "^Мама мыла (\w+)$"
А теперь мне понадобилось заматчить все строки, в которых мама моет все что угодно кроме рамы. Как? (Вариант с «заматчить „^Мама мыла раму$“ и выкинуть, а остальное пропустить» мне поему-то не подошел, не помню почему.)
Мама мыла [^раму]
?
?
Вроде это выделит «Мама мыла „+1 какой то любой символ, кроме р, а, м, у?
В таком варианте “^Мама мыла [^раму]+$» выделит «Мама мыла „+ что угодно, где нет символов р, а, м, у
В таком варианте “^Мама мыла [^раму]+$» выделит «Мама мыла „+ что угодно, где нет символов р, а, м, у
Забыли заматчить «не раму». Negative lookahead совпадает (правильно, конечно, «не совпадает», то так можно мозг сломать) с позицией, а не подвыражением, соответственно захватится только «Мама мыла » в строке «Мама мыла Ваню».
Работает, спасибо!
PS: по ссылке нужно убрать и снова поставить галку на «g» чтобы заработало как ожидается.
PS: по ссылке нужно убрать и снова поставить галку на «g» чтобы заработало как ожидается.
Можно использовать поисковые конструкции чтобы исключить совпадение рамы.
Что-то типа ^Мама мыла (\w+)(?<! раму)$. Вторая часть (?! раму) говорит что в этой позиции подвыражение не должно совпадать назад (то что уже захватили в \w+). Но опять же надо понимать, что текст должен совпадать с НЕ рамой. В данном случае это не критично, потому что с \w идет квантификатор +, который требует хотя бы одной этой самой \w. Если бы стояла *, то были бы отличия в поведении.
Что-то типа ^Мама мыла (\w+)(?<! раму)$. Вторая часть (?! раму) говорит что в этой позиции подвыражение не должно совпадать назад (то что уже захватили в \w+). Но опять же надо понимать, что текст должен совпадать с НЕ рамой. В данном случае это не критично, потому что с \w идет квантификатор +, который требует хотя бы одной этой самой \w. Если бы стояла *, то были бы отличия в поведении.
tsya.ru
Всегда жутко завидовал тем, кто понимает регулярки. Я когда вижу эту кашу из символов, мой мозг отказывается работать и тактично уходит в сторону заката.
Как раз сегодня открыл Фридла, поэтому большая часть вещей показалась очевидной, хотя дошел только до 42 страницы. Но поясните пожалуйста, что такое «квотирование». Гуглил — не нашёл, или в книге это понятие дальше рассматривается?
По-видимому, Lattyf переводит словом «квотировать» англоязычный термин «escape», означающий в данном случае «предпринять усилия для устранения служебного смысла некоторого символа».
Например, символ точки («.») в регулярных выражениях имеет служебный смысл («найти на этом месте любой символ»). Поэтому, чтобы искать точку в буквальном смысле («найти на этом месте точку, только точку и ничего, кроме точки»), в регулярном выражении перед точкою надо поставить обратнуюкосую черту («\.»).
Например, символ точки («.») в регулярных выражениях имеет служебный смысл («найти на этом месте любой символ»). Поэтому, чтобы искать точку в буквальном смысле («найти на этом месте точку, только точку и ничего, кроме точки»), в регулярном выражении перед точкою надо поставить обратную
Ну здесь автор имеет ввиду написание "\" перед метасимволом, чтобы метасимвол читался как обычный символ.
".jpg$" => ".jpg", «ajpg», «0jpg»
"\.jpg$" => ".jpg"
".jpg$" => ".jpg", «ajpg», «0jpg»
"\.jpg$" => ".jpg"
Выше уже пояснили, но хочу лобавить, что как раз один из тех терминов, для которого все переводы для непосвященного не очевидны.
Когда я первый раз увидел перевод «экранировать» тоже не смог сразу найти.
Когда я первый раз увидел перевод «экранировать» тоже не смог сразу найти.
ться-тся
Объясните, пожалуйста, что означает «квотирование»? Это экранирование бэкслешем?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Тонкости регулярных выражений. Часть 1: метасимволы внутри и вне символьных классов