Как вы изучаете регулярные выражения? [закрыто]


80

Я не спрашиваю, где учиться. Я нашел много хороших ресурсов в Интернете, книги и т. Д.

Но как, черт возьми, я справлюсь с ними. Где это начало, конец? Когда процессор regexp продвигается по тексту, когда он удерживает свою позицию и пытается найти другое совпадение? и т.п.

Я чувствую, что пытаюсь выяснить иероглифы на египетских пирамидах.


2
Вроде по теме - регулярные выражения.инфо . Используйте это и предложение @ Jalayn ниже. Учись на практике!
Freiheit

6
gskinner.com/RegExr - лучший инструмент для разработки регулярных выражений, которые я нашел.
Каллум Роджерс

Немного за один раз. Начните с простых вещей («aaa», «aa.», «A * b» и т. Д.) И переходите к компонентам, специфичным для реализации (например, PCRE). Затем придумайте шаблон и попробуйте создать подходящее для него регулярное выражение.
Тайлер

Я научился методом проб и ошибок с помощью великолепной программы RegexBuddy. regexbuddy.com (я не получаю кредита на рекламу этого, эта программа действительно упростила изучение)
Ям Маркович

rubular.com - хороший инструмент для разработки регулярных выражений.
Газлер

Ответы:


68

Я думаю, что знание теории автоматов имеет решающее значение для понимания.

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

Что касается конкретного синтаксиса и различий между различными реализациями ... Ну, некоторые вещи, которые вы просто должны запомнить. Есть средства для этого тоже.

редактировать

Некоторые из комментариев ниже подняли важные моменты:

  1. Не забывайте, что регулярные выражения (как реализовано в большинстве языков программирования) - это расширенный набор регулярных выражений в теории автоматов. Хотя хорошее теоретическое образование является полезным началом, оно не расскажет вам всего. (Спасибо, Дэвид Торнли)

  2. Несколько комментаторов говорят, что можно изучить различные синтаксис регулярных выражений без изучения теоретических основ. Хотя верно то, что вы можете изучать синтаксис, не полностью понимая, как он работает, у меня сложилось впечатление, что полное понимание - это то, что было после ОП. Вопрос был о фактической основе: когда продвигается процессор? Когда это останавливается? Как он решает, что это совпадение? Это основа, это теория, и она основана на теории автоматов. Конечно, вы можете водить машину, не зная, как работает двигатель. Но если вас спрашивают, «как газ на самом деле заставляет его двигаться» - вам нужно поговорить о том, как построен двигатель, не так ли?


Комментаторы: если вы хотите обсудить тонкости этого вопроса, пожалуйста, используйте чат . В противном случае, пожалуйста, оставьте ответ или проголосуйте за ответы, которые вы считаете наиболее правильными.

Спасибо за редактирование. Это делает этот ответ гораздо ближе к истине. Хотя я все еще не думаю, что вам действительно нужно знать Теорию автоматов (я не знаю этого, но я все еще могу писать сложные регулярные выражения), я согласен, что некоторые знания теории могут помочь. Особенно знание того, как отслеживание возвратов работает и контролируется жадными / неряшливыми / собственническими квантификаторами, может действительно помочь вашему пониманию.
NikiC

Только мои 2 цента: в недавнем видеоролике о библиотеке регулярных выражений C ++ STL на канале MSDN Channel 9, ведущий, который также поддерживает STL, сказал, что они реализуют его как автомат. Таким образом, знание этой теории действительно должно дать ОП некоторое представление о том, как работает регулярное выражение.
Корб

5
Я не согласен с вступительным заявлением вообще. Когда я изучал регулярные выражения, я ничего не знал о теории автоматов. Три десятилетия спустя я до сих пор не знаю. Что я действительно знал, так это как читать справочную страницу, понимать ее буквально и как экспериментировать сразу.
Брайан Окли

1
@ Брайан, хорошо ... Твой опыт доказывает это. Возможно, вы знаете, как его использовать , но вы не совсем понимаете, как это работает. Если вы это сделаете - тогда вы знаете кое-что о теории автоматов, даже если не знаете, как ее назвать. Но вы не можете полностью понять регулярные выражения, не зная теорию автоматов, и никакое чтение справочных страниц не может вам помочь (конечно, если вы не читаете справочные страницы, объясняющие теорию автоматов).
littleadv

36

Практикуя.

Я узнал, развлекаясь с веб-соскоб. Я уверен, что я был не один, делая это просто для удовольствия.

Один пример: напишите какой-нибудь код, который получает последние футбольные и теннисные данные (вид спорта, который вам нравится на самом деле) с вашего любимого спортивного сайта. Сделайте это, написав некоторый код для загрузки страницы, извлеките оценки с помощью регулярных выражений и выведите их на консоль или в какой-нибудь текстовый файл. Убедитесь, что с помощью регулярного выражения, которое вы выбираете, вы получаете только оценки, и ничего больше. Иногда это может быть довольно сложно :-)

Второй пример: напишите некоторый код, который получает изображение вашего любимого веб-комикса (например, мне очень нравится Sinfest ) и который хранит его где-то на вашем жестком диске. Используйте только регулярные выражения для извлечения тега «img» и его содержимого. При желании также получить его заголовок, если он где-то хранится.


15
Разбор HTML с помощью регулярных выражений, как правило, плохая идея.
Макс.

10
Конечно, это плохая идея. Использование синтаксических анализаторов DOM / Sax или других специальных программ для чтения XML - это то, что следует использовать «в общем». Но тема здесь об изучении регулярных выражений, и я поделился тем, как я узнал о регулярных выражениях, что я считаю «забавным» способом.
Джалайн

3
Использование парсеров XML для веб-страниц HTML - еще худшая идея, чем очистка их регулярными выражениями.
Сколима

8
Что ж, я хотел быть более точным в том, что я думал об этом, но мне было лень, и я просто отреагировал на комментарий ... Я думаю, мы все можем согласиться с тем, что 1. использование регулярных выражений для разбора всего документа - плохая идея 2. использование синтаксических анализаторов XML для разбора HTML - плохая идея 3. использование синтаксических анализаторов XML для синтаксического анализа XHTML правильно 4. правильное использование регулярных выражений для извлечения однострочных или какой-то очень специфической информации из HTML. Или я могу просто подвести итог: правильный инструмент для правильной работы ...
Джалайн

23

Я знаю, что вы не просите ресурсов, но Джеффри Э. Ф. Фридл научился осваивать регулярные выражения и узнал, как они работают и как их использовать. Даже после того, как многие из них были использованы для разбора разных вещей, в первой главе для меня появилось что-то новое.

Вы хотите понять эти чертовы регулярные выражения? Прочитайте эту книгу.


2
Это должен быть окончательный ответ.
Слим

1
+100 000 Одна из лучших технических книг, когда-либо и удобно о теме вопроса.
Аффе

Очень понравилась эта книга. Ключевым моментом является то, что это помогло мне понять все различные функции, доступные в Regex. Вы не сможете запомнить весь синтаксис при чтении книги, но книга покажет вам все, что существует, чтобы вы знали, какие инструменты вам нужны для решения проблемы, когда она возникнет.
Кибби

Абсолютно +1 за этот ответ. Я отказывался от регулярных выражений, пока, наконец, не сел и не прочитал этот важный том построчно. Теперь Фридл дал мне достаточно оснований, чтобы я мог рассуждать о всех многочисленных нестандартных вариациях, которые преследуют нас сегодня! Я настоятельно рекомендую эту ссылку на ФП и всем остальным. +1 к @slim за его комментарий, также!
Джон Тоблер

19

Где это начало, конец? Когда процессор regexp продвигается по тексту, когда он удерживает свою позицию и пытается найти другое совпадение? и т.п.

Я хотел бы начать с уточнения ваших целей, а затем выяснить ваш стиль обучения .

Что поразило меня в вашем вопросе, так это то, что вы спрашиваете: «Как я выучу регулярные выражения? и затем сразу же задайте вопрос "как внутреннее ядро ​​регулярных выражений работает?" Вы, кажется, намекаете, что эти две вещи имеют какое-то отношение друг к другу, что является показательным моментом. Может быть, вы - человек, который учится тому, как что-то работает, разбирая это на части или создавая это самостоятельно.

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

Так какова ваша цель? Вы собираетесь узнать, как создать движок регулярных выражений? или вы собираетесь научиться эффективно использовать регулярные выражения для решения бизнес-задач? Достижение этих разных целей, вероятно, требует различных методов обучения.

Чтобы ответить на ваш конкретный вопрос о том, как работает механизм регулярных выражений: это зависит. «Классический» теоретический подход к регулярным выражениям состоит в том, чтобы использовать регулярное выражение в качестве схемы для недетерминированного конечного автомата, затем построить эквивалентный детерминированный конечный автомат, а затем выполнить этот автомат для входных данных.

Практически никто не делает этого по нескольким причинам. Во-первых, число состояний, умноженное на количество возможных входных символов, приводит к таблице переходов состояний, которая чертовски огромна даже для небольших регулярных выражений. Конечно, большая часть этого может быть сжата, но все же, это много правил перехода. Во-вторых, другие подходы обычно быстрее. В-третьих, так называемые «регулярные» выражения содержатся в современных библиотеках регулярных выражений, ничего подобного. Они не являются обычными языками вообще; они часто распознаются автоматами, не конечными языками автоматов.

(Я начал писать большую серию статей о том, как все это работает, но я исчерпал себя только после первых двенадцати статей . Вы можете найти их интересными, если вы хотите краткий учебник по теоретическим основам основных регулярных выражений.)

Реальные движки регулярных выражений вместо этого обычно используют стратегию возврата. Механизм регулярных выражений, который мы создали для механизма JScript более десяти лет назад, теперь компилирует регулярное выражение в язык байт-кода, который включает в себя примитивы для распознавания последовательностей и возврата к более ранним состояниям. Затем мы создали интерпретатор для этого языка байт-кода.

Я не стал бы пытаться понять, как работает механизм регулярных выражений, прежде чем иметь достаточно четкое представление о том, как использовать регулярные выражения. Сконцентрируйтесь на этом, прежде чем начинать копаться в стратегиях оптимизации различных движков.


+1, потому что вы обращаетесь к нескольким вещам, которые полезно знать при использовании регулярных выражений; Однако я не согласен с вашим мнением о том, что не нужно знать внутренности. Для бурения вы абсолютно правы; в компьютерах я обнаружил, что раньше, чем я думаю вначале, я дошел до того, что мне нужно понять что-то внутреннее, чтобы освоить его приложение - будь то C ++ (компиляторы), веб-серверы (HTTP) или регулярные выражения (теория автоматов) , Не до такой степени, что я становлюсь экспертом, но хорошее понимание основополагающих принципов часто является самым быстрым способом обучения.
Феликс Домбек

3
@ Феликс: Я думаю, что мы на самом деле согласны. Я сказал, что для начинающих приложений, как правило, нет необходимости понимать, как работает инструмент, чтобы использовать его. Эти ласковые слова были преднамеренными. Для подручного или мастерского использования инструмента очень полезно хотя бы кое-что понять о его внутренностях, чтобы вы могли точно предсказать, скажем, инструмент будет иметь плохую производительность.
Эрик Липперт

Хм, я бы не согласился с этим. Некоторые из наиболее полезных бизнес-программ, которые я создал, использовали теорию, которую я выучил в lexx и yacc, для эффективного решения проблем. Вы правы, хотя, полное понимание уровня PhD не требуется. Я должен буду прочитать сообщения в блоге, они выглядят самыми интересными.
Спенсер Рэтбун

Вы говорите, что регулярные выражения не являются регулярными - но я думал, что регулярный мир в имени имел в виду выражения, которым он соответствует - например, регулярное выражение, "[0-9]{3}"которое может соответствовать любому трехзначному числу, а трехзначное число 480 является примером для регулярного выражения это соответствует.
конфигуратор

1
@configurator: «обычный» язык по определению является языком, который может распознаваться конечным автоматом. Каждый регулярный язык может быть охарактеризован «регулярным выражением», состоящим только из союзов, альтернатив, цепочек и Клини Стар. Но большинство механизмов «регулярных выражений» в наши дни распознают более сложные языки, чем обычные языки; например, язык «предложений с правильно подобранными скобками» не является регулярным, но вы можете сопоставить его с «регулярным выражением» в некоторых механизмах регулярных выражений.
Эрик Липперт

6

Как, черт возьми, я их решаю?

Как и любая новая вещь:

10 Study
20 Practice
30 goto 10

Учиться

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

Это все соответствие строк

Регулярные выражения являются средством сопоставления шаблонов в тексте. Это декларативный язык, сам по себе встроенный во множество других языков программирования.

Я хотел бы подчеркнуть, что это декларативный язык, регулярные выражения полезны для выражения того, с какой строкой соответствовать, но они никоим образом не отражают, как программа должна выполнять сопоставление. По этой причине можно использовать очень быстрые и очень медленные регулярные выражения в одном и том же языке программирования, просто используя другой анализатор RegEx.

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

Некоторые будут (и должны) жаловаться на мое предыдущее предложение, говоря что-то вроде:

RegEx не делает программу проще.

Это верно

RegEx не делает программу проще, RegEx упрощает написание программы. Вы все еще должны быть тщательными в своем тестировании, чтобы убедиться, что все правильные случаи совпадают правильно, а все неправильные случаи нет. Действительно сложно проверить «все», а со сложными шаблонами действительно сложно проверить «большинство». В худшем случае, вы все равно должны тестировать «некоторые» случаи.

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

Когда вы делаете нормальное сопоставление строк, вы проверяете одно строковое значение против другого. Они могут приходить откуда угодно, но в итоге нужно сравнить две строки друг с другом:

if ( 'foo' == 'bar' ) doSomething();

Этот пример - отстой, потому что он никогда ничего не сделает

if ( foo == 'bar' ) doSomething();

Намного лучше; сейчас мы заранее не знаем, будет ли что-то сделано или нет. Теперь мы можем начать принимать пользовательский ввод:

if ( prompt( 'Say "bar" to do something.' ) == 'bar' ) doSomething();

Замечательно, что теперь пользователи могут вводить, barи что-то будет происходить, пока вы не получите отчеты об ошибках от пользователей, говорящих, что "bar"это не работает, или что «BAR» не работает, или что они набрали BRA100 раз, и ничего не происходит.

Не обращая внимания на орфографические ошибки и лишние символы, 'bar' != 'BAR'программистам необходимо придумать способ проверки того, где символы являются неправильным регистром.

Простое решение, используйте toLowerCase. Это прекрасно работает, но как насчет наших пользователей, которые используют британский английский вместо американского английского, когда вы подходите something == 'color'? Теперь вы должны соответствовать something == 'color' || somthing == 'colour'.

Короче говоря, простые шаблоны очень быстро превращаются во множество повторяющегося кода.

Пример цвета можно просто сопоставить с:

/colou?r/.test( something )

глубокое понимание основ регулярных выражений может значительно сократить время, затрачиваемое на повторное изобретение колеса.

Где учиться

Большинство языков, которые реализуют регулярные выражения, имеют по крайней мере один ресурс, доступный для определенного синтаксиса использования регулярных выражений в этом языке. Один для JavaScript можно найти на MDN

прочитай это.
все это.
затем прочитайте это снова.

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

практика

Прочитав все о RegEx, вы, вероятно, не поймете большинство из них. Это потому, что вы на самом деле ничего с этим не делаете .

Я упомянул, почему я выбрал JS для этого примера, я призываю вас возиться с этим в вашем браузере. Это быстро, и вы можете сделать это прямо в вашей строке URL.

У JS есть несколько разных и простых способов использования RegEx:

string.match( regex )
regex.exec( string )
regex.test( string )

Начиная с чего-то простого, например:

javascript:'color'.match(/colou?r/);

это простой способ проникнуть в дверь. Поиграй с этим, разбей его, посмотри, что соответствует, а что нет.

Когда вы застряли на практике, продолжайте 30. Вы должны читать, чтобы узнать больше, но вы должны практиковаться, чтобы действительно понять то, что вы узнали.


+1 за рекомендацию возиться с JavaScript в браузере.
Джон Тоблер

5

Брайан Керниган пишет простой reg-ex процессор в книге Beautiful Code . Я понимаю, что вы не ищете ресурсы, но это может помочь увидеть базовую реализацию внутри.


Упомянутый «процессор регулярных выражений» фактически не реализует дизъюнкции, и при данном подходе их очень трудно добавить. Мне нравится книга, но это одна вещь, которой я был разочарован.
Феликс Домбек

4

При нормальной разработке отладочный код может дать очень полезную информацию. Регулярные выражения ничем не отличаются. Итак, рискуя походить на рекламу, приобретите RegexBuddy . У него есть отличный инструмент для визуального отображения того, что делает движок, когда он обрабатывает ваше выражение и строку ввода.


1
+1, «Regex Hero» тоже хорош: regexhero.net/tester
Анджело

Regexbuddy - один из моих любимых инструментов. Вид на древовидную структуру невероятно полезен, поскольку позволяет мгновенно тестировать, генерируя регулярное выражение. Я выучил гораздо больше регулярных выражений, не пытаясь выучить его, просто используя его.
Чао

1
Я всегда находил RegexBuddy интересным, но мне не нравится покупать его. Для базового тестирования регулярных выражений существует множество других утилит. Для просмотра текстового описания регулярного выражения, хотя есть меньше инструментов. Платная версия Regex Hero делает это тоже. Одной вещью, довольно уникальной для RegexBuddy, является Regex Debugger, который показывает каждое принятие или отклонение персонажа и каждое возвращение в мельчайших деталях, что может действительно помочь при отладке большого и очень сложного регулярного выражения. Я не заметил никакого другого инструмента, который делает это.
Кевин Кэткарт

3

Регулярные выражения могут очень быстро усложниться, поэтому я бы порекомендовал вам начать изучать их с помощью учебных пособий. Знайте, что самая простая форма регулярного выражения - это строка, представляющая то, что вы ищете. К сожалению, для определения специальных правил поиска требуются определенные символы, и эти символы необходимо экранировать, иначе вы создадите недопустимое или неправильное регулярное выражение.

Мой совет - начать с примера того, что вы ищете, и избегать этого. Другими словами, если вы искали что-то в скобках, возьмите пример одной такой строки в тексте, в котором вы ищете: (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 обозначает конец, если вам приходится искать особо сложные шаблоны и не знать, как их избежать. Это спасло мне жизнь больше, чем пару раз.


3

Я дам вам простой ответ на простой вопрос. Во-первых, вам необходимо понять, что такое регулярные выражения (RegEx) - что они делают, для чего они используются. Тогда отличный инструмент для начала.

  1. Что это такое? RegEx - это язык для выражения соответствия шаблону. То есть, используя его, вы можете создать комбинацию символов, которая распознает или находит шаблоны в тексте. Чем это полезно? При программировании вы можете указывать компьютерам сопоставлять текст из некоторого источника (пользовательский ввод, веб-страница и т. Д.) И определять, содержатся ли в нем определенные шаблоны текста. Например, точка (.) Представляет любой символ - букву или цифру. Числа в фигурных скобках представляют собой количество итераций, поэтому «. {1,30}» обозначает любой символ, повторяющийся от 1 до 30 раз - другими словами, у вас не может быть пустой строки, и она не может быть длиннее 30 персонажи. И это продолжается оттуда.

  2. Как начать обучение? Абсолютно лучшим инструментом, который я видел, является Expresso , но он предназначен только для Windows. Он имеет очень обширный графический интерфейс, в котором вы щелкаете по элементам, которые хотите добавить в выражение, а затем тестирующему, чтобы сравнить его с различными данными, чтобы увидеть результаты. Я не видел ничего хорошего на Mac (но я использую Windows на VMWare, так что мне не нужна версия Mac), я не тратил много времени на изучение Linux.


1
Спасибо за отзыв о Expresso. Я попробовал это, и это здорово!
Джим в Техасе

3

В дополнение к хорошей справке, вы действительно учитесь использовать хорошие инструменты обучения. Один использует редактор Vim с открытым исходным кодом , с двумя установленными опциями:

  1. : set incsearch ... при вводе шаблона поиска в командной строке редактор на лету переходит к первому фрагменту текста, который соответствует, и выделяет именно то, что соответствует. Если вы наберете что-то, что больше не будет совпадать с чем-либо, Vim вернет ваш курсор туда, где вы были, когда начинали.
  2. : set hlsearch ... это говорит Vim показывать выделенный фон для всего текста, который соответствует текущему поиску RE.

Другой - использовать бесплатный инструмент RegExCoach . Вы вставляете текст, который хотите найти, затем в другом окне вы создаете свое регулярное выражение. Как и Vim, он подчеркивает удачные матчи на лету.


RegExCoach теперь является условно-бесплатным. Я нашел это очень полезным в разработке сложных RE-стиля Perl.
Firstrock

2

Вы начинаете с базового сравнения строк. Очень просто, но не так сильно.

Затем, возможно, вам пришло в голову, что вам нужны сравнения без учета регистра, чтобы «греческий» и «GreeK» сравнивались одинаково. Это немного мощнее.

Однажды вы заметите, что небольшие различия в правописании не должны мешать двум словам сравнивать равные: то есть «организовать» и «организовать» должны сравнивать равные Вы садитесь и пишете код, который делает это, и вы счастливы.

Пока вы не абстрагируетесь немного больше и не поймете, что иногда вы хотите, чтобы все слова, оканчивающиеся на «ize», сравнивались со своими братьями по британскому правописанию. Или повторение некоторых строк определенное количество раз. И, конечно же, вам нужно объединить все это.

И так далее. Наконец, вы, скорее всего, получите какое-то обозначение, где не каждый персонаж обозначает себя. Ничто другое не является регулярным выражением. Это можно увидеть как описание набора строк.

И потом, это довольно просто и сводится к следующим 3 основным принципам:

У вас есть базовые регулярные выражения: символы, которые обозначают самих себя, классы символов, удобные и не очень удобные сокращения для классов символов, таких как \ d или \ p {Lu} для заглавных букв.

И затем, у вас есть несколько возможностей объединить их: если r1 и r2 являются регулярными выражениями, то и r1r2 r1 | r2 (r1).

И последнее, но не менее важное: модификаторы повторения: r * r + r {n, m}

Это самое, что вам нужно знать. Все остальное вы можете искать, когда вам это нужно.


2

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

RegexBuddy , например, имеет визуальный режим отладки, который позволяет вам шаг за шагом выполнять регулярные выражения и показывает вам через основные моменты и пояснительный текст, что движок регулярных выражений делает на каждом шаге. На их сайте есть видео, демонстрирующее эту отладку .


2

Все, что мы можем вам дать, - это больше ресурсов для изучения. Этот вопрос сам по себе является ресурсом.

Кстати, я довольно легко выучил регулярные выражения на этом сайте: http://www.regular-expressions.info/


1

Для меня то, что соответствует регулярному выражению в процессе его построения, действительно помогает мне упростить мою жизнь и лучше понять их.

Для этого я открою файл с целевым текстом в Emacs, а затем использую isearch-forward-regexpкоманду. Когда вы вводите регулярное выражение, Emacs показывает вам, что оно соответствует (это часть isearch).

Для запуска команды в Emacs вы можете использовать <ESC>xisearch-forward-regexp.


1

Я выучил регулярные выражения, изучая flex и bison, которые используются для создания лексических анализаторов и парсеров. Без регулярных выражений вы не сможете получить анализатор, а книги lexx и yacc невероятно хороши для того, чтобы пройтись по теории, не двигаясь слишком быстро.

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

Еще одна вещь в изучении lexx и yacc, по сравнению с регулярными выражениями, заключается в том, что вы узнаете, как они работают внутри. Как программа смотрит в будущее, почему она заканчивает сопоставление, как она хранит данные и многое другое. Понимание указателей является абсолютной необходимостью, но если вы получите lexx и yacc, и пройдете их с самого начала, вы изучите все, что вы просили, и получите чрезвычайно мощный инструмент для остальной части вашей карьеры.

Этот вопрос включает в себя кучу ресурсов для обучения и гибкий скелет, который я бросил вместе.


1

Больше я сначала пытаюсь убедиться, что нет более простого способа решить проблему / «токенизировать» строку.

Когда вы не можете найти его, я рассматриваю это как проблему, а не в попытке сопоставить то, что вы хотите, из строки, скорее, это вопрос НЕ сопоставления того, что вы не хотите. Это в основном потому, что регулярные выражения являются жадными. Но это послужило мне хорошим подходом для получения того, чего я хочу.

Вот пример:

string = "Sep 22 19:57:38 host fcron[9137]: \
          Job fbsetbg -r $HOME/backgrounds/ \
          started for user user (pid 9138)"

чтобы соответствовать минуте:

string.match /^\w+\s\d+\s\d+:(\d+):\d+\s\w+\s/ # correct but bad
string.match /\d+:([^:]+):\d+/                 # correct and good

Вместо того, чтобы пытаться найти время вместе со всем остальным, попробуйте найти четкие границы.

Пример немного надуман, но все, что я мог придумать.


1

Один из подходов, который я использовал, заключался в том, чтобы найти группу проектов с открытым исходным кодом, которые нуждались в обновлении синтаксиса, а затем написать все более сложный сценарий sed, состоящий из множества регулярных выражений.

Сценарий должен был работать с множеством разных файлов в каждом проекте с открытым исходным кодом. Тогда бегите против множества разных проектов с разными стилями. Я начал с чего-то очень простого, как %s/before/after тогда, и обнаружил, что оно соответствует слишком многим случаям. поэтому я добавил больше вещей, чтобы предотвратить это. Затем я нашел разные проекты, использующие разные стили синтаксиса, которые требовали разных изменений.

В конце концов я закончил с

  • отличные навыки и знания о регулярных выражениях
  • хорошие навыки с sed
  • помогать многим проектам с открытым исходным кодом
  • получать большой вклад активности показаны в моем профиле GitHub
  • еще один хороший инструмент «швейцарский армейский нож» для виртуального пояса с инструментами

и в этом подходе помогла необходимость

  • достичь реальных целей без обмана
  • использовать навыки (regex) как часть большей цели с большей мотивацией.
  • быть в состоянии показать доказательства своих навыков, изменив чужой код, а затем пересмотрев изменения.

Я также передам, что есть множество сайтов для разных языков - ruby, javascript и т. Д., Которые позволят вам поиграть с выражениями и образцом текста для немедленного удовлетворения. Это:

регулярные выражения на нескольких языках на одном сайте

сосредоточиться на матч группы:


0

Я обнаружил, что изучение регулярных выражений похоже на изучение таблиц умножения - да, вам нужно понимать идеи, стоящие за этим, но в конечном итоге вам просто нужно делать это часто и неоднократно.

Когда я учился, я ставил перед собой цель выполнять несколько регулярных упражнений в день. На практике это означало, по крайней мере, один раз в день, я пытался посмотреть на строку или текст на моем экране и столкнулся с проблемой - «могу ли я получить все адреса электронной почты отсюда» или «найти все вхождения слова «код» используются как глагол, а не как существительное, «в таком духе».

Делать это в течение нескольких недель действительно окупалось - и, конечно, необходимы периодические обзоры и переподготовка. Я должен из-за одного.

Я также нашел этот онлайн-инструмент полезным, так как он позволяет мне тестировать регулярные выражения в режиме реального времени: http://www.gethifi.com/tools/regex

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.