Я не спрашиваю, где учиться. Я нашел много хороших ресурсов в Интернете, книги и т. Д.
Но как, черт возьми, я справлюсь с ними. Где это начало, конец? Когда процессор regexp продвигается по тексту, когда он удерживает свою позицию и пытается найти другое совпадение? и т.п.
Я чувствую, что пытаюсь выяснить иероглифы на египетских пирамидах.
learning
regular-expressions
dumbBoy
источник
источник
Ответы:
Я думаю, что знание теории автоматов имеет решающее значение для понимания.
Как только вы поймете, что такое автомат и как определяются регулярные языки , понимание регулярных выражений станет намного проще.
Что касается конкретного синтаксиса и различий между различными реализациями ... Ну, некоторые вещи, которые вы просто должны запомнить. Есть средства для этого тоже.
редактировать
Некоторые из комментариев ниже подняли важные моменты:
Не забывайте, что регулярные выражения (как реализовано в большинстве языков программирования) - это расширенный набор регулярных выражений в теории автоматов. Хотя хорошее теоретическое образование является полезным началом, оно не расскажет вам всего. (Спасибо, Дэвид Торнли)
Несколько комментаторов говорят, что можно изучить различные синтаксис регулярных выражений без изучения теоретических основ. Хотя верно то, что вы можете изучать синтаксис, не полностью понимая, как он работает, у меня сложилось впечатление, что полное понимание - это то, что было после ОП. Вопрос был о фактической основе: когда продвигается процессор? Когда это останавливается? Как он решает, что это совпадение? Это основа, это теория, и она основана на теории автоматов. Конечно, вы можете водить машину, не зная, как работает двигатель. Но если вас спрашивают, «как газ на самом деле заставляет его двигаться» - вам нужно поговорить о том, как построен двигатель, не так ли?
источник
Практикуя.
Я узнал, развлекаясь с веб-соскоб. Я уверен, что я был не один, делая это просто для удовольствия.
Один пример: напишите какой-нибудь код, который получает последние футбольные и теннисные данные (вид спорта, который вам нравится на самом деле) с вашего любимого спортивного сайта. Сделайте это, написав некоторый код для загрузки страницы, извлеките оценки с помощью регулярных выражений и выведите их на консоль или в какой-нибудь текстовый файл. Убедитесь, что с помощью регулярного выражения, которое вы выбираете, вы получаете только оценки, и ничего больше. Иногда это может быть довольно сложно :-)
Второй пример: напишите некоторый код, который получает изображение вашего любимого веб-комикса (например, мне очень нравится Sinfest ) и который хранит его где-то на вашем жестком диске. Используйте только регулярные выражения для извлечения тега «img» и его содержимого. При желании также получить его заголовок, если он где-то хранится.
источник
Я знаю, что вы не просите ресурсов, но Джеффри Э. Ф. Фридл научился осваивать регулярные выражения и узнал, как они работают и как их использовать. Даже после того, как многие из них были использованы для разбора разных вещей, в первой главе для меня появилось что-то новое.
Вы хотите понять эти чертовы регулярные выражения? Прочитайте эту книгу.
источник
Я хотел бы начать с уточнения ваших целей, а затем выяснить ваш стиль обучения .
Что поразило меня в вашем вопросе, так это то, что вы спрашиваете: «Как я выучу регулярные выражения? и затем сразу же задайте вопрос "как внутреннее ядро регулярных выражений работает?" Вы, кажется, намекаете, что эти две вещи имеют какое-то отношение друг к другу, что является показательным моментом. Может быть, вы - человек, который учится тому, как что-то работает, разбирая это на части или создавая это самостоятельно.
Для начинающих приложений, как правило, нет необходимости понимать, как работает инструмент, чтобы эффективно его использовать. Вам не нужно знать, как работает дрель, чтобы пробить отверстия в дереве; Вы должны понимать, как использовать дрель, а не как строить дрель.
Так какова ваша цель? Вы собираетесь узнать, как создать движок регулярных выражений? или вы собираетесь научиться эффективно использовать регулярные выражения для решения бизнес-задач? Достижение этих разных целей, вероятно, требует различных методов обучения.
Чтобы ответить на ваш конкретный вопрос о том, как работает механизм регулярных выражений: это зависит. «Классический» теоретический подход к регулярным выражениям состоит в том, чтобы использовать регулярное выражение в качестве схемы для недетерминированного конечного автомата, затем построить эквивалентный детерминированный конечный автомат, а затем выполнить этот автомат для входных данных.
Практически никто не делает этого по нескольким причинам. Во-первых, число состояний, умноженное на количество возможных входных символов, приводит к таблице переходов состояний, которая чертовски огромна даже для небольших регулярных выражений. Конечно, большая часть этого может быть сжата, но все же, это много правил перехода. Во-вторых, другие подходы обычно быстрее. В-третьих, так называемые «регулярные» выражения содержатся в современных библиотеках регулярных выражений, ничего подобного. Они не являются обычными языками вообще; они часто распознаются автоматами, не конечными языками автоматов.
(Я начал писать большую серию статей о том, как все это работает, но я исчерпал себя только после первых двенадцати статей . Вы можете найти их интересными, если вы хотите краткий учебник по теоретическим основам основных регулярных выражений.)
Реальные движки регулярных выражений вместо этого обычно используют стратегию возврата. Механизм регулярных выражений, который мы создали для механизма JScript более десяти лет назад, теперь компилирует регулярное выражение в язык байт-кода, который включает в себя примитивы для распознавания последовательностей и возврата к более ранним состояниям. Затем мы создали интерпретатор для этого языка байт-кода.
Я не стал бы пытаться понять, как работает механизм регулярных выражений, прежде чем иметь достаточно четкое представление о том, как использовать регулярные выражения. Сконцентрируйтесь на этом, прежде чем начинать копаться в стратегиях оптимизации различных движков.
источник
"[0-9]{3}"
которое может соответствовать любому трехзначному числу, а трехзначное число 480 является примером для регулярного выражения это соответствует.Как и любая новая вещь:
Учиться
Я считаю, что большинство успешных учителей начинают преподавать любой предмет, сначала предоставив немного фона для предмета. Важно иметь контекст того, что вы изучаете, и, самое главное, почему вы изучаете это.
Это все соответствие строк
Регулярные выражения являются средством сопоставления шаблонов в тексте. Это декларативный язык, сам по себе встроенный во множество других языков программирования.
Я хотел бы подчеркнуть, что это декларативный язык, регулярные выражения полезны для выражения того, с какой строкой соответствовать, но они никоим образом не отражают, как программа должна выполнять сопоставление. По этой причине можно использовать очень быстрые и очень медленные регулярные выражения в одном и том же языке программирования, просто используя другой анализатор RegEx.
Причина создания регулярных выражений одинакова для большинства языков программирования: программисты снова и снова решали одну и ту же сложную задачу и решили, что им нужен более простой способ написания кода.
Некоторые будут (и должны) жаловаться на мое предыдущее предложение, говоря что-то вроде:
RegEx не делает программу проще.
Это верно
RegEx не делает программу проще, RegEx упрощает написание программы. Вы все еще должны быть тщательными в своем тестировании, чтобы убедиться, что все правильные случаи совпадают правильно, а все неправильные случаи нет. Действительно сложно проверить «все», а со сложными шаблонами действительно сложно проверить «большинство». В худшем случае, вы все равно должны тестировать «некоторые» случаи.
Давайте включим несколько примеров, которые я в обязательном порядке выбрал для JavaScript движка RegEx, потому что я могу легко протестировать его вживую в браузере и потому, что мне не придется выполнять экранирование строк при использовании литералов RegEx.
Когда вы делаете нормальное сопоставление строк, вы проверяете одно строковое значение против другого. Они могут приходить откуда угодно, но в итоге нужно сравнить две строки друг с другом:
Этот пример - отстой, потому что он никогда ничего не сделает
Намного лучше; сейчас мы заранее не знаем, будет ли что-то сделано или нет. Теперь мы можем начать принимать пользовательский ввод:
Замечательно, что теперь пользователи могут вводить,
bar
и что-то будет происходить, пока вы не получите отчеты об ошибках от пользователей, говорящих, что"bar"
это не работает, или что «BAR» не работает, или что они набралиBRA
100 раз, и ничего не происходит.Не обращая внимания на орфографические ошибки и лишние символы,
'bar' != 'BAR'
программистам необходимо придумать способ проверки того, где символы являются неправильным регистром.Простое решение, используйте
toLowerCase
. Это прекрасно работает, но как насчет наших пользователей, которые используют британский английский вместо американского английского, когда вы подходитеsomething == 'color'
? Теперь вы должны соответствоватьsomething == 'color' || somthing == 'colour'
.Короче говоря, простые шаблоны очень быстро превращаются во множество повторяющегося кода.
Пример цвета можно просто сопоставить с:
глубокое понимание основ регулярных выражений может значительно сократить время, затрачиваемое на повторное изобретение колеса.
Где учиться
Большинство языков, которые реализуют регулярные выражения, имеют по крайней мере один ресурс, доступный для определенного синтаксиса использования регулярных выражений в этом языке. Один для JavaScript можно найти на MDN
прочитай это.
все это.
затем прочитайте это снова.
Это требует времени, чтобы учиться, думать об этом как об инвестициях: час на изучение RegEx теперь экономит час, когда в следующий раз вам нужно будет выполнить какое-либо сопоставление с образцом строки, а затем еще час - в следующий раз после этого.
практика
Прочитав все о RegEx, вы, вероятно, не поймете большинство из них. Это потому, что вы на самом деле ничего с этим не делаете .
Я упомянул, почему я выбрал JS для этого примера, я призываю вас возиться с этим в вашем браузере. Это быстро, и вы можете сделать это прямо в вашей строке URL.
У JS есть несколько разных и простых способов использования RegEx:
Начиная с чего-то простого, например:
это простой способ проникнуть в дверь. Поиграй с этим, разбей его, посмотри, что соответствует, а что нет.
Когда вы застряли на практике, продолжайте
30
. Вы должны читать, чтобы узнать больше, но вы должны практиковаться, чтобы действительно понять то, что вы узнали.источник
Брайан Керниган пишет простой reg-ex процессор в книге Beautiful Code . Я понимаю, что вы не ищете ресурсы, но это может помочь увидеть базовую реализацию внутри.
источник
При нормальной разработке отладочный код может дать очень полезную информацию. Регулярные выражения ничем не отличаются. Итак, рискуя походить на рекламу, приобретите RegexBuddy . У него есть отличный инструмент для визуального отображения того, что делает движок, когда он обрабатывает ваше выражение и строку ввода.
источник
Регулярные выражения могут очень быстро усложниться, поэтому я бы порекомендовал вам начать изучать их с помощью учебных пособий. Знайте, что самая простая форма регулярного выражения - это строка, представляющая то, что вы ищете. К сожалению, для определения специальных правил поиска требуются определенные символы, и эти символы необходимо экранировать, иначе вы создадите недопустимое или неправильное регулярное выражение.
Мой совет - начать с примера того, что вы ищете, и избегать этого. Другими словами, если вы искали что-то в скобках, возьмите пример одной такой строки в тексте, в котором вы ищете:
(this is an example of something you'd want to find)
Начните с экранирования символов, чтобы искать буквальный символ:
\(this is an example of something you'd want to find\)
Проверьте это, убедитесь, что он находит ваш пример правильно. Затем обобщите выражение, чтобы найти любой такой текст, а не только пример, который вы нашли. Таким образом, он стал бы:
\([^)]*\)
(означает любой символ, который не является ")" для любого числа случаев, включая 0).Протестируйте его снова и убедитесь, что он не только находит ваш пример, но и другим нравится. Ищите более сложные, но более частые регулярные выражения в Интернете и исправляйте их с помощью существующих регулярных выражений, чтобы не беспокоиться о каждой отдельной возможности.
Вот и все. И о, учиться и любить \ Q ... \ E. В большинстве языков регулярных выражений \ Q обозначает начало буквенного шаблона, а \ E обозначает конец, если вам приходится искать особо сложные шаблоны и не знать, как их избежать. Это спасло мне жизнь больше, чем пару раз.
источник
Я дам вам простой ответ на простой вопрос. Во-первых, вам необходимо понять, что такое регулярные выражения (RegEx) - что они делают, для чего они используются. Тогда отличный инструмент для начала.
Что это такое? RegEx - это язык для выражения соответствия шаблону. То есть, используя его, вы можете создать комбинацию символов, которая распознает или находит шаблоны в тексте. Чем это полезно? При программировании вы можете указывать компьютерам сопоставлять текст из некоторого источника (пользовательский ввод, веб-страница и т. Д.) И определять, содержатся ли в нем определенные шаблоны текста. Например, точка (.) Представляет любой символ - букву или цифру. Числа в фигурных скобках представляют собой количество итераций, поэтому «. {1,30}» обозначает любой символ, повторяющийся от 1 до 30 раз - другими словами, у вас не может быть пустой строки, и она не может быть длиннее 30 персонажи. И это продолжается оттуда.
Как начать обучение? Абсолютно лучшим инструментом, который я видел, является Expresso , но он предназначен только для Windows. Он имеет очень обширный графический интерфейс, в котором вы щелкаете по элементам, которые хотите добавить в выражение, а затем тестирующему, чтобы сравнить его с различными данными, чтобы увидеть результаты. Я не видел ничего хорошего на Mac (но я использую Windows на VMWare, так что мне не нужна версия Mac), я не тратил много времени на изучение Linux.
источник
В дополнение к хорошей справке, вы действительно учитесь использовать хорошие инструменты обучения. Один использует редактор Vim с открытым исходным кодом , с двумя установленными опциями:
Другой - использовать бесплатный инструмент RegExCoach . Вы вставляете текст, который хотите найти, затем в другом окне вы создаете свое регулярное выражение. Как и Vim, он подчеркивает удачные матчи на лету.
источник
Вы начинаете с базового сравнения строк. Очень просто, но не так сильно.
Затем, возможно, вам пришло в голову, что вам нужны сравнения без учета регистра, чтобы «греческий» и «GreeK» сравнивались одинаково. Это немного мощнее.
Однажды вы заметите, что небольшие различия в правописании не должны мешать двум словам сравнивать равные: то есть «организовать» и «организовать» должны сравнивать равные Вы садитесь и пишете код, который делает это, и вы счастливы.
Пока вы не абстрагируетесь немного больше и не поймете, что иногда вы хотите, чтобы все слова, оканчивающиеся на «ize», сравнивались со своими братьями по британскому правописанию. Или повторение некоторых строк определенное количество раз. И, конечно же, вам нужно объединить все это.
И так далее. Наконец, вы, скорее всего, получите какое-то обозначение, где не каждый персонаж обозначает себя. Ничто другое не является регулярным выражением. Это можно увидеть как описание набора строк.
И потом, это довольно просто и сводится к следующим 3 основным принципам:
У вас есть базовые регулярные выражения: символы, которые обозначают самих себя, классы символов, удобные и не очень удобные сокращения для классов символов, таких как \ d или \ p {Lu} для заглавных букв.
И затем, у вас есть несколько возможностей объединить их: если r1 и r2 являются регулярными выражениями, то и r1r2 r1 | r2 (r1).
И последнее, но не менее важное: модификаторы повторения: r * r + r {n, m}
Это самое, что вам нужно знать. Все остальное вы можете искать, когда вам это нужно.
источник
Два хороших других ответа говорят вам, чтобы выучить теорию, лежащую в основе регулярных выражений, и попрактиковаться, которые являются отличным советом. Я также рекомендую приобрести хороший инструмент для визуальных регулярных выражений, который поможет вам, если вы серьезно.
RegexBuddy , например, имеет визуальный режим отладки, который позволяет вам шаг за шагом выполнять регулярные выражения и показывает вам через основные моменты и пояснительный текст, что движок регулярных выражений делает на каждом шаге. На их сайте есть видео, демонстрирующее эту отладку .
источник
Все, что мы можем вам дать, - это больше ресурсов для изучения. Этот вопрос сам по себе является ресурсом.
Кстати, я довольно легко выучил регулярные выражения на этом сайте: http://www.regular-expressions.info/
источник
Для меня то, что соответствует регулярному выражению в процессе его построения, действительно помогает мне упростить мою жизнь и лучше понять их.
Для этого я открою файл с целевым текстом в Emacs, а затем использую
isearch-forward-regexp
команду. Когда вы вводите регулярное выражение, Emacs показывает вам, что оно соответствует (это часть isearch).Для запуска команды в Emacs вы можете использовать
<ESC>xisearch-forward-regexp
.источник
Я выучил регулярные выражения, изучая flex и bison, которые используются для создания лексических анализаторов и парсеров. Без регулярных выражений вы не сможете получить анализатор, а книги lexx и yacc невероятно хороши для того, чтобы пройтись по теории, не двигаясь слишком быстро.
По сути, в наши дни практически все движки regex следуют одним и тем же принципам. Все они - конечные автоматы, и если вы действительно это сделаете, то сможете разобраться практически с любым написанным вами кодом. Это похоже на изучение рекурсии в том, что, получив ее, вы инстинктивно применяете ее к проблемам. Их легко решить с помощью правильного инструмента, но очень трудно без него.
Еще одна вещь в изучении lexx и yacc, по сравнению с регулярными выражениями, заключается в том, что вы узнаете, как они работают внутри. Как программа смотрит в будущее, почему она заканчивает сопоставление, как она хранит данные и многое другое. Понимание указателей является абсолютной необходимостью, но если вы получите lexx и yacc, и пройдете их с самого начала, вы изучите все, что вы просили, и получите чрезвычайно мощный инструмент для остальной части вашей карьеры.
Этот вопрос включает в себя кучу ресурсов для обучения и гибкий скелет, который я бросил вместе.
источник
Больше я сначала пытаюсь убедиться, что нет более простого способа решить проблему / «токенизировать» строку.
Когда вы не можете найти его, я рассматриваю это как проблему, а не в попытке сопоставить то, что вы хотите, из строки, скорее, это вопрос НЕ сопоставления того, что вы не хотите. Это в основном потому, что регулярные выражения являются жадными. Но это послужило мне хорошим подходом для получения того, чего я хочу.
Вот пример:
чтобы соответствовать минуте:
Вместо того, чтобы пытаться найти время вместе со всем остальным, попробуйте найти четкие границы.
Пример немного надуман, но все, что я мог придумать.
источник
Один из подходов, который я использовал, заключался в том, чтобы найти группу проектов с открытым исходным кодом, которые нуждались в обновлении синтаксиса, а затем написать все более сложный сценарий sed, состоящий из множества регулярных выражений.
Сценарий должен был работать с множеством разных файлов в каждом проекте с открытым исходным кодом. Тогда бегите против множества разных проектов с разными стилями. Я начал с чего-то очень простого, как
%s/before/after
тогда, и обнаружил, что оно соответствует слишком многим случаям. поэтому я добавил больше вещей, чтобы предотвратить это. Затем я нашел разные проекты, использующие разные стили синтаксиса, которые требовали разных изменений.В конце концов я закончил с
и в этом подходе помогла необходимость
Я также передам, что есть множество сайтов для разных языков - ruby, javascript и т. Д., Которые позволят вам поиграть с выражениями и образцом текста для немедленного удовлетворения. Это:
регулярные выражения на нескольких языках на одном сайте
сосредоточиться на матч группы:
источник
Я обнаружил, что изучение регулярных выражений похоже на изучение таблиц умножения - да, вам нужно понимать идеи, стоящие за этим, но в конечном итоге вам просто нужно делать это часто и неоднократно.
Когда я учился, я ставил перед собой цель выполнять несколько регулярных упражнений в день. На практике это означало, по крайней мере, один раз в день, я пытался посмотреть на строку или текст на моем экране и столкнулся с проблемой - «могу ли я получить все адреса электронной почты отсюда» или «найти все вхождения слова «код» используются как глагол, а не как существительное, «в таком духе».
Делать это в течение нескольких недель действительно окупалось - и, конечно, необходимы периодические обзоры и переподготовка. Я должен из-за одного.
Я также нашел этот онлайн-инструмент полезным, так как он позволяет мне тестировать регулярные выражения в режиме реального времени: http://www.gethifi.com/tools/regex
источник