Як ви вивчаєте регулярні вирази? [зачинено]


80

Я не запитую, де вчитися. Я знайшов багато хороших ресурсів в Інтернеті, книг тощо.

Але як до біса я їх вирішую. Де це початок, кінець? Коли процесор regexp просувається над текстом, коли він тримає свою стійку і намагається інший збіг? тощо.

Мені здається, що я намагаюся з'ясувати ієрогліфи на єгипетських пірамідах.


2
Сортування теми - regular-expressions.info . Скористайтеся цим і пропозицією @ Jalayn нижче. Вчіться, роблячи!
Freiheit

6
gskinner.com/RegExr - найкращий інструмент для розробки регексів, які я знайшов.
Callum Rogers

Трохи за раз. Почніть з простих речей ("aaa", "aa.", "A * b" тощо) і працюйте по дорозі до конкретних компонентів реалізації (наприклад, PCRE). Потім придумайте візерунок і спробуйте зробити регулярний вираз, який йому підходить.
tylerl

Я дізнався шляхом спроб та помилок із чудовою програмою RegexBuddy. regexbuddy.com (я не маю кредиту за рекламу цього, ця програма дійсно полегшила навчання)
Yam Marcovic

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

Відповіді:


68

Я думаю, що знання теорії автоматів є критичним для розуміння.

Як тільки ви зрозумієте, що таке автомат, і як визначені регулярні мови , зрозуміти регулярні вирази буде набагато простіше.

Щодо конкретного синтаксису та відмінностей між різними реалізаціями ... Ну, деякі речі, які ви просто повинні пам’ятати. Для цього теж є посібники .

Редагувати

Деякі з коментарів нижче підняли важливі моменти:

  1. Не забувайте, що регулярні вирази (як це реалізовано в більшості мов програмування) є набором регулярних виразів в теорії автомати. Хоча гарне теоретичне підґрунтя є корисним місцем для початку, воно не скаже тобі все. (Спасибі, Девід Торнлі)

  2. Кілька коментаторів кажуть, що можна вивчити різні синтаксиси регулярних виразів, не вивчаючи теоретичну основу. Хоча це правда, що ви можете вивчити синтаксис, не повністю розуміючи, як він працює, але враження було, що повне розуміння - це те, що було після ОП. Питання стосувалося фактичної основи: коли процесор просувається? Коли це зупиняється? Як він вирішує, що його збіг? Це основа, це теорія, і вона базується на теорії автоматів. Звичайно, ви можете керувати автомобілем, не знаючи, як працює двигун. Але якщо вас запитують "як насправді газ приводить його в рух" - ви повинні поговорити про те, як побудований двигун, чи не так?


Коментатори: якщо ви хочете обговорити точніші питання цього питання, будь ласка, скористайтеся чатом . В іншому випадку, будь ласка, подумайте про те, щоб залишити відповідь або проголосувати за відповіді, які ви вважаєте найбільш правильними.

Дякуємо за редагування Це робить цю відповідь набагато ближче до істини. Хоча я все ще не думаю, що вам дійсно потрібно знати теорію автоматів (я цього не знаю, але все ще можу писати складні регулярні вирази), я погоджуюся, що деякі знання теорії можуть допомогти. Особливо знання того, як працює зворотний трек і контролюється жадібними / невірними / присвійними кванторами, може справді допомогти вам зрозуміти.
NikiC

Всього два мої центи: в недавній серії відео про бібліотеку регулярних виразів C ++ STL на каналі MSDN на каналі 9, ведучий, який також є обслуговувачем STL, сказав, що вони реалізують це як автомати. Тому знання цієї теорії дійсно повинно дати ОП деяку думку про те, як працює геджекс.
korbes

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

1
@Bryan добре ... Ваш досвід kindof доводить суть. Ви , можливо , знаєте , як використовувати його, але ви на самому ділі не розумієте , як це працює. Якщо ви це робите - то ви щось знаєте про теорію автоматів, навіть якщо не знаєте, як її назвати. Але ви не можете зрозуміти регулярні вирази повністю, не знаючи теорії автоматів, і жодна кількість читаючих сторінок не зможе вам там допомогти (якщо, звичайно, ви не читаєте довідкові сторінки, що пояснюють теорію автоматів).
littleadv

36

Вправляючись.

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

Один приклад. Напишіть код, у якому ви знайдете найновіші результати з футболу, тенісу (спорт, який вам справді подобається) з улюбленого веб-сайту спорту. Зробіть це, написавши якийсь код для завантаження сторінки, витягніть бали з регулярними виразами та виведіть їх на консоль або в якийсь текстовий файл. Переконайтеся, що з обраним регулярним виразом ви отримуєте лише оцінки, і більше нічого. Іноді це може бути досить складно :-)

Другий приклад. Напишіть код, який витягує зображення вашої улюбленої веб-сторінки (мені дуже подобається Sinfest ), і зберігає його десь на вашому жорсткому диску. Використовуйте лише регулярні вирази, щоб отримати тег "img" та його вміст. Необов'язково також отримати його назву, якщо він десь зберігається.


15
Розбір HTML з регулярними виразами, як правило, погана ідея.
Maxpm

10
Звичайно, це погана ідея. Використання парсерів DOM / Sax або інших виділених зчитувачів XML - це те, що слід використовувати «загалом». Але тут тема полягає у вивченні регулярних виразів, і я поділився тим, як я дізнався про регулярні вирази тим, що, на мою думку, було «веселим» способом.
Джалайн

3
Використання XML-аналізаторів для веб-сторінок HTML - це ще гірша ідея, ніж їх скребки регулярними виразами.
skolima

8
Ну добре, я хотів бути більш точним щодо того, що я думав про це, але я був ледачий і я просто відреагував на коментар ... Я думаю, що ми можемо всі погодитись, що 1. використання регулярних виразів для розбору всього документа - погана ідея 2. Використовувати XML-парсери для розбору HTML - це погана ідея 3. Використовувати XML-парсери для розбору XHTML правильно 4. Використовувати регулярні вирази для отримання одноклассників або правильна деяка дуже конкретна інформація з HTML. Або я можу просто підвести підсумок: правильний інструмент для правильної роботи ...
Jalayn

23

Я знаю, що ви не просите ресурсів, але засвоєння регулярних виразів Джефрі Е. Ф. Фрідля було тим, як я дізнався, як вони працюють і як ними користуватися. Навіть після того, як я багато використовував їх для розбору різних речей, перша глава для мене мала нові речі.

Ви хочете зрозуміти ці чортові regexp? Прочитайте цю книгу.


2
Це має бути остаточною відповіддю.
струнка

1
+100 000 Один з найкращих технічних книг коли-небудь, і зручно про тему питання.
Affe

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

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

19

Де це початок, кінець? Коли процесор regexp просувається над текстом, коли він тримає свою стійку і намагається інший збіг? тощо.

Я б почав з уточнення ваших цілей, а потім з'ясування вашого стилю навчання .

Що вразило мене у вашому питанні, це те, що ви запитуєте "як я вчу регулярні вирази?" а потім негайно слідкуйте за цим запитанням: "як працює механізм регулярних виразів внутрішньо?" Ви, здається, натякаєте на те, що ці дві речі мають щось спільне між собою, що є важливим моментом. Можливо, ви людина, яка вчиться, як щось працює, розбираючи його, або будуючи його самостійно.

Для початківців додатків зазвичай не потрібно розуміти, як працює інструмент, щоб ефективно його використовувати. Вам не потрібно знати, як працює буровий мотор для того, щоб пробити отвори в деревині; потрібно розуміти, як користуватися свердлом, а не як будувати свердло.

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

Для вирішення вашого конкретного питання про те, як працює двигун регулярного вираження: це залежить. "Класичний" теоретичний підхід до регулярних виразів полягає в тому, щоб використовувати регулярний вираз як креслення для недетермінованого кінцевого автомата, потім побудувати еквівалентний детермінований кінцевий автомат, а потім виконати цей автомат проти вводу.

Майже ніхто насправді цього не робить з кількох причин. По-перше, кількість станів, помножене на кількість можливих символів введення, дає таблицю переходу стану, яка є химерною величезною навіть для невеликих регулярних виразів. Звичайно, більшість із них можна стиснути, але все-таки це багато правил переходу. По-друге, інші підходи зазвичай швидші. По-третє, так звані "регулярні" вирази є в сучасних бібліотеках регулярних викидів, нічого подібного. Вони зовсім не звичайні мови; їх часто розпізнають за допомогою автоматичних автоматів, а не обмеженими мовами автоматів.

(Я почав писати довгу серію про те, як працює цей матеріал, але у мене випало пари лише після перших дванадцяти статей . Можливо, вам здасться цікавим, якщо ви хочете короткий буквар на теоретичному тлі основних регулярних виразів.)

Натомість реальні двигуни регулярного вираження зазвичай використовують стратегію зворотного відстеження. Двигун регулярних виразів, який ми створили для двигуна JScript більше десяти років тому, тепер компілює регулярний вираз у мову байт-коду, що включає примітиви для розпізнавання послідовностей та зворотного відстеження до попередніх станів. Потім ми побудували інтерпретатор для цієї мови байт-кодів.

Я б не намагався зрозуміти, як працює движок regexp, перш ніж мати досить чітке розуміння того, як використовувати регулярні вирази. Концентруйтесь на цьому, перш ніж ви почнете розбиратися в стратегіях оптимізації різних різних двигунів.


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

3
@Felix: Я думаю, що ми дійсно згодні. Я сказав , що для початківців додатків не існує , як правило , немає необхідності , щоб зрозуміти , як інструмент працює для того , щоб використовувати його. Ті лайки були навмисними. Для мандрівника або майстерного використання інструменту дуже корисно зрозуміти хоча б щось про його внутрішні, щоб можна було точно передбачити, де цей інструмент матиме погані показники, скажімо.
Ерік Ліпперт

Хм, я б дещо не погодився. Деякі з найкорисніших бізнес-програм, які я створив, використовували теорію, яку я навчився в lexx та yacc для ефективного вирішення проблем. Ти маєш рацію, але повне розуміння рівня phd не потрібно. Мені доведеться читати повідомлення в блозі, вони виглядають найцікавіше.
Спенсер Ратбун

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

1
@configurator: "Регулярна" мова - це, за визначенням, мова, яку можна розпізнати за допомогою кінцевого автомата. Кожну регулярну мову можна охарактеризувати "регулярним виразом", що складається лише з об'єднань, альтернатив, катенацій та зірки Клінова. Але більшість механізмів «регулярного вираження» в наші дні розпізнають більш складні мови, ніж звичайні мови; наприклад, мова "речень з правильно підібраними дужками" не є регулярною, але ви можете зіставити її з "регулярним виразом" у деяких двигунах регулярних виразів.
Ерік Ліпперт

6

Як, до біса, я їх вирішую?

Як і будь-яка нова річ:

10 Study
20 Practice
30 goto 10

Вивчення

Я вважаю, що більшість успішних вчителів починають викладати будь-який предмет, спочатку надаючи трохи передумови. Важливо мати контекст того, що ви вивчаєте, і, що найголовніше, чому ви це вивчаєте.

Це все відповідність рядків

Регулярні вирази - це засіб узгодження шаблонів у тексті. Це сама декларативна мова, включена в численні інші мови програмування.

Я хотів би підкреслити, що це декларативна мова, регулярні вирази корисні для вираження того, який рядок повинен відповідати, але вони жодним чином не виражають, яким чином програма повинна робити відповідність. З цієї причини можна використовувати регулярні вирази дуже швидко і дуже повільно на одній і тій же мові програмування просто за допомогою іншого аналізатора RegEx.

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

Деякі з них (і повинні) скаржитися на моє попереднє речення, кажучи щось за принципом:

RegEx не робить програму простішою.

це правда

RegEx не робить програму простішою, RegEx робить написання програми простішим. Ви все ще повинні бути ретельними у своєму тестуванні, щоб бути впевненим, що всі правильні випадки зібрані правильно, а всі неправильні випадки - ні. Тестувати "всіх" справді важко, а зі складними візерунками справді важко перевірити "найбільше". У гіршому випадку, ви все-таки повинні протестувати "деякі" випадки.

дозволяє включити кілька прикладів. Я обов'язково вибрав RegEx-механізм JavaScript, тому що я можу легко перевірити його в браузері і тому, що мені не доведеться робити жодних рядків під час використання 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" теж приємний: regexhero.net/tester
Анджело

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

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

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. : встановити hlsearch ... це вказує Vim показати виділений фон у всьому тексті, який відповідає поточному пошуку RE.

Інший - використовувати безкоштовний інструмент для виклику RegExCoach . Ви вставляєте текст, який хочете шукати, а потім в іншому вікні розвиваєте своє регулярне вираження. Як і Vim, він висвітлює успішні матчі на льоту.


RegExCoach тепер безкоштовний. Я вважаю це дуже корисним у розробці складних ПЗ в стилі Perl.
Firstrock

2

Ви починаєте з базового порівняння рядків. Дуже легко, але теж не так сильно.

Далі, можливо, у вас трапилося, що вам потрібні порівняно інсеситивні порівняння, щоб "грецький" та "грецький" порівняли рівні. Це трохи потужніше.

Один день, коли ви помітили невеликі відмінності в написанні, не повинен заважати 2 словам порівнювати рівні: тобто "впорядкувати" і "впорядкувати" повинні порівнювати рівні. Ви сідаєте і пишете якийсь код, який це робить, і ви щасливі.

Поки ви не абстрагуєтеся трохи більше і не зрозумієте, що вам іноді хочеться, щоб усі слова, які закінчуються на "ize", порівнювали рівних зі своїми братами у британській орфографії. Або повторення деяких рядків певну кількість разів. І, звичайно, потрібно все це поєднувати.

І так далі. Нарешті, ви, швидше за все, опинитесь із якоюсь нотацією, де не кожен персонаж стоїть за собою. Ніщо інше не є зворотним формуванням. Можна побачити це як опис набору рядків.

І тоді, це досить легко і зводиться до наступних 3 основних принципів:

У вас є основні регулярні вирази: символи, які є самостійними, класи символів, зручні і не такі зручні абревіатури для класів символів, як \ d або \ p {Lu} для великих літер.

І тоді, у вас є деякі можливості їх комбінування: якщо r1 і r2 - це регулярні виразки, то r1r2 r1 | r2 (r1).

Останнє, але не в останню чергу модифікатори повторення: r? r * r + r {n, m}

Це найбільше, що вам потрібно знати. Все, що ви можете шукати, коли вам це потрібно.


2

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

Наприклад, RegexBuddy має режим візуальної налагодження, який дозволяє переходити до виконання функції регулярного виразу, а також показує вам основні моменти та пояснювальний текст, що робить движок регулярного вибору на кожному кроці. На їхньому сайті є відео, що демонструє цю налагодження .



1

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

Для цього я відкрию файл із цільовим текстом у Emacs, а потім скористаюся isearch-forward-regexpкомандою. Увійшовши в регулярний вираз, Emacs показує вам, що він відповідає (це частина "пошук").

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


1

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

Принципово, що практично всі двигуни регулярного випромінювання в наші дні дотримуються тих же принципів. Всі вони є машинами з кінцевим станом, і якщо ви справді це зробите, то у вас є нога майже на будь-якому написаному вами коді. Це аналогічно навчанню рекурсії в тому, що, як тільки ви його отримаєте, ви інстинктивно застосовуєте його до проблем. Їх легко вирішити за допомогою правильного інструменту, але дуже важко без нього.

Ще одна річ у вивченні 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
  • ще один хороший інструмент «швейцарський армійський ніж» для віртуального інструментального ременя

і допомогло в цьому підході потребою

  • досягати фактичних цілей без обману
  • використовувати навички (регулярного вираження) як частину більшої мети з більшою мотивацією.
  • вміти показати докази навичок, які я навчився, змінюючи код інших, а потім переглядаючи зміни.

Я також зазначу, що існує маса сайтів для різних мов - ruby, javascript тощо, які дозволять вам пограти з виразами та зразком тексту для негайного задоволення. Це:

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

зосередитись на групах матчів:


0

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

Коли я навчався, я поставив би собі за мету робити кілька вправ на регулярний вираз на день. На практиці це означало щонайменше раз на день, я б спробував поглянути на рядок або текст на екрані і зіткнувся з викликом - "чи можу я отримати всі адреси електронної пошти звідси", або "знайти всі вживання слова «код», що використовується як дієслово, а не іменник, «подібні речі.

Це за кілька тижнів справді окупилося - і звичайно, потрібні періодичні огляди та оновлення. Мені належить один.

Мені здається, що цей онлайн-інструмент також корисний, оскільки він дозволить перевірити регекс в режимі реального часу: http://www.gethifi.com/tools/regex

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.