Elettracompany.com

Компьютерный справочник
5 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Регулярные выражения обучение онлайн

Регулярные выражения для новичков

Регулярные выражения для новичков

  • Статьи , 28 января 2017 в 18:49
  • Пётр Соковых

Задачи и их разборы с javascript.ru; в статье использованы комиксы xkcd.

Что такое регулярные выражения?

Если вам когда-нибудь приходилось работать с командной строкой, вы, вероятно, использовали маски имён файлов. Например, чтобы удалить все файлы в текущей директории, которые начинаются с буквы “d”, можно написать rm d* .

Регулярные выражения представляют собой похожий, но гораздо более сильный инструмент для поиска строк, проверки их на соответствие какому-либо шаблону и другой подобной работы. Англоязычное название этого инструмента — Regular Expressions или просто RegExp. Строго говоря, регулярные выражения — специальный язык для описания шаблонов строк.

Реализация этого инструмента различается в разных языках программирования, хоть и не сильно. В данной статье мы будем ориентироваться в первую очередь на реализацию Perl Compatible Regular Expressions.

Основы синтаксиса

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

21 апреля в 16:00 в 16:00, онлайн, беcплатно

Однако уже здесь следует быть аккуратным — как и любой язык, регулярные выражения имеют спецсимволы, которые нужно экранировать. Вот их список: . ^ $ * + ? < >[ ] | ( ) . Экранирование осуществляется обычным способом — добавлением перед спецсимволом.

Набор символов

Предположим, мы хотим найти в тексте все междометия, обозначающие смех. Просто Хаха нам не подойдёт — ведь под него не попадут “Хехе”, “Хохо” и “Хихи”. Да и проблему с регистром первой буквы нужно как-то решить.

Здесь нам на помощь придут наборы — вместо указания конкретного символа, мы можем записать целый список, и если в исследуемой строке на указанном месте будет стоять любой из перечисленных символов, строка будет считаться подходящей. Наборы записываются в квадратных скобках — паттерну [abcd] будет соответствовать любой из символов “a”, “b”, “c” или “d”.

Внутри набора большая часть спецсимволов не нуждается в экранировании, однако использование перед ними не будет считаться ошибкой. По прежнему необходимо экранировать символы “” и “^”, и, желательно, “]” (так, [][] обозначает любой из символов “]” или «[», тогда как [[]х] – исключительно последовательность “[х]”). Необычное на первый взгляд поведение регулярок с символом “]” на самом деле определяется известными правилами, но гораздо легче просто экранировать этот символ, чем их запоминать. Кроме этого, экранировать нужно символ «-», он используется для задания диапазонов (см. ниже).

Если сразу после [ записать символ ^ , то набор приобретёт обратный смысл — подходящим будет считаться любой символ кроме указанных. Так, паттерну [^xyz] соответствует любой символ, кроме, собственно, “x”, “y” или “z”.

Итак, применяя данный инструмент к нашему случаю, если мы напишем [Хх][аоие]х[аоие] , то каждая из строк “Хаха”, “хехе”, “хихи” и даже “Хохо” будут соответствовать шаблону.

Предопределённые классы символов

Для некоторых наборов, которые используются достаточно часто, существуют специальные шаблоны. Так, для описания любого пробельного символа (пробел, табуляция, перенос строки) используется s , для цифр — d , для символов латиницы, цифр и подчёркивания “_” — w .

Если необходимо описать вообще любой символ, для этого используется точка — . . Если указанные классы написать с заглавной буквы ( S , D , W ) то они поменяют свой смысл на противоположный — любой непробельный символ, любой символ, который не является цифрой, и любой символ кроме латиницы, цифр или подчёркивания соответственно.

Также с помощью регулярных выражений есть возможность проверить положение строки относительно остального текста. Выражение b обозначает границу слова, B — не границу слова, ^ — начало текста, а $ — конец. Так, по паттерну bJavab в строке “Java and JavaScript” найдутся первые 4 символа, а по паттерну bJavaB — символы c 10-го по 13-й (в составе слова “JavaScript”).

Комикс про регулярные выражения с xkcd.ru

Диапазоны

У вас может возникнуть необходимость обозначить набор, в который входят буквы, например, от “б” до “ф”. Вместо того, чтобы писать [бвгдежзиклмнопрстуф] можно воспользоваться механизмом диапазонов и написать [б-ф] . Так, паттерну x[0-8A-F][0-8A-F] соответствует строка “xA6”, но не соответствует “xb9” (во-первых, из-за того, что в диапазоне указаны только заглавные буквы, во-вторых, из-за того, что 9 не входит в промежуток 0-8).

Механизм диапазонов особенно актуален для русского языка, ведь для него нет конструкции, аналогичной w . Чтобы обозначить все буквы русского алфавита, можно использовать паттерн [а-яА-ЯёЁ] . Обратите внимание, что буква “ё” не включается в общий диапазон букв, и её нужно указывать отдельно.

Квантификаторы (указание количества повторений)

Вернёмся к нашему примеру. Что, если в “смеющемся” междометии будет больше одной гласной между буквами “х”, например “Хаахаааа”? Наша старая регулярка уже не сможет нам помочь. Здесь нам придётся воспользоваться квантификаторами.

Обратите внимание, что квантификатор применяется только к символу, который стоит перед ним.

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

Таким образом, с помощью квантификаторов мы можем улучшить наш шаблон для междометий до [Хх][аоеи]+х[аоеи]* , и он сможет распознавать строки “Хааха”, “хееееех” и “Хихии”.

Ленивая квантификация

Предположим, перед нами стоит задача — найти все HTML-теги в строке

Очевидное решение здесь не сработает — оно найдёт всю строку целиком, т.к. она начинается с тега абзаца и им же заканчивается. То есть содержимым тега будет считаться строка

Это происходит из-за того, что по умолчанию квантификатор работают по т.н. жадному алгоритму — старается вернуть как можно более длинную строку, соответствующую условию. Решить проблему можно двумя способами. Первый — использовать выражение ]*> , которое запретит считать содержимым тега правую угловую скобку. Второй — объявить квантификатор не жадным, а ленивым. Делается это с помощью добавления справа к квантификатору символа ? . Т.е. для поиска всех тегов выражение обратится в .

Ревнивая квантификация

Иногда для увеличения скорости поиска (особенно в тех случаях, когда строка не соответствует регулярному выражению) можно использовать запрет алгоритму возвращаться к предыдущим шагам поиска для того, чтобы найти возможные соответствия для оставшейся части регулярного выражения. Это называется ревнивой квантификацией. Квантификатор делается ревнивым с помощью добавления к нему справа символа + . Ещё одно применение ревнивой квантификации — исключение нежелательных совпадений. Так, паттерну ab*+a в строке “ababa” будут соответствовать только первые три символа, но не символы с третьего по пятый, т.к. символ “a”, который стоит на третьей позиции, уже был использован для первого результата.

Скобочные группы

Для нашего шаблона “смеющегося” междометия осталась самая малость — учесть, что буква “х” может встречаться более одного раза, например, “Хахахахааахахооо”, а может и вовсе заканчиваться на букве “х”. Вероятно, здесь нужно применить квантификатор для группы [аиое]+х , но если мы просто напишем [аиое]х+ , то квантификатор + будет относиться только к символу “х”, а не ко всему выражению. Чтобы это исправить, выражение нужно взять в круглые скобки: ([аиое]х)+ .

Таким образом, наше выражение превращается в [Хх]([аиое]х?)+ — сначала идёт заглавная или строчная “х”, а потом произвольное ненулевое количество гласных, которые (возможно, но не обязательно) перемежаются одиночными строчными “х”. Однако это выражение решает проблему лишь частично — под это выражение попадут и такие строки, как, например, “хихахех” — кто-то может быть так и смеётся, но допущение весьма сомнительное. Очевидно, мы можем использовать набор из всех гласных лишь единожды, а потом должны как-то опираться на результат первого поиска. Но как?…

Запоминание результата поиска по группе (обратная связь)

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

Результат поиска по всем регулярному выражению: “

”.
Результат поиска по первой группе: “p”, “b”, “/b”, “i”, “/i”, “/i”, “/p”.

На результат поиска по группе можно ссылаться с помощью выражения n , где n — цифра от 1 до 9. Например выражению (w)(w)12 соответствуют строки “aaaa”, “abab”, но не соответствует “aabb”.

Если выражение берётся в скобки только для применения к ней квантификатора (не планируется запоминать результат поиска по этой группе), то сразу после первой скобки стоит добавить ?: , например (?:[abcd]+w) .

С использованием этого механизма мы можем переписать наше выражение к виду [Хх]([аоие])х?(?:1х?)* .

Перечисление

Чтобы проверить, удовлетворяет ли строка хотя бы одному из шаблонов, можно воспользоваться аналогом булевого оператора OR, который записывается с помощью символа | . Так, под шаблон Анна|Одиночество попадают строки “Анна” и “Одиночество” соответственно. Особенно удобно использовать перечисления внутри скобочных групп. Так, например (?:a|b|c|d) полностью эквивалентно [abcd] (в данном случае второй вариант предпочтительнее в силу производительности и читаемости).

С помощью этого оператора мы сможем добавить к нашему регулярному выражению для поиска междометий возможность распознавать смех вида “Ахахаах” — единственной усмешке, которая начинается с гласной: [Хх]([аоие])х?(?:1х?)*|[Аа]х?(?:ах?)+

Полезные сервисы

Потренироваться и / или проверить своё регулярное выражение на каком-либо тексте без написания кода можно с помощью таких сервисов, как RegExr, Regexpal или Regex101. Последний, вдобавок, приводит краткие пояснения к тому, как регулярка работает.

Разобраться, как работает регулярное выражение, которое попало к вам в руки, можно с помощью сервиса Regexper — он умеет строить понятные диаграмы по регулярному выражению.

RegExp Builder — визуальный конструктор функций JavaScript для работы с регулярными выражениями.

Больше инструментов можно найти в нашей подборке.

Задания для закрепления

Найдите время

Время имеет формат часы:минуты. И часы, и минуты состоят из двух цифр, пример: 09:00. Напишите регулярное выражение для поиска времени в строке: “Завтрак в 09:00”. Учтите, что “37:98” – некорректное время.

Regex Tester

This online tool allows you to test regular expression in JavaScript and PCRE (Python, PHP). It also allows you to generate a string example from a RegEx.

You can consult the regex Quick Start or see the full user guide to help you to use this regular expression tester.

User guide

  • Step 0: Choose the regex engine: JavaScript or PCRE (PHP, Python).
  • Step 1: Copy and paste or directly type your regular expression to test in the «Regular expression to test» field.
  • Step 2: Select the flags you want in «Flags» section.
  • Step 3: Copy and paste or directly type your test string in the «test string» field.
  • As soon as you make a modification (regular expression, flags or test string):
    • Step 4: An explanation is generated about of your regex. It uses regulex, it is a JavaScript Regular Expression Parser & Visualizer (Written in pure JavaScript).
    • Step 5: A message indicates the number of correspondence
    • Your regex is highlighted according to the syntax. It is a beta version, it can be wrong.

    You can also replace regular expression matches in text with a replacement string.

    Step 6: Copy and paste or directly type your substitute string in the «Substitution» field.

    Step 7: Substitutions are automatically performed on your test string.

    You can save your regex in order to share it. You can protect your share with a password, so only you can change it. See «Save and Share» section:

    Generate a string from RegEx (Beta):
    Clicks on «Generate a string from RegEx (Beta)» in order to generate a string that matches with the regex.

    Substitutions are not managed.

    The unavoidables

    Some regex that can be useful (without warranty).

    The last RFC is complex, there is no reliable solution, this regex should work more than 99% of the time (You must turn off case sensitivity).

    The regex below allows to validate alphanumeric string. Be careful, w authorizes the underscore character.

    The regex below allows to validate MD5 string.

    The regex below allows to validate IP v4.

    About regular expression

    A regular expression is a sequence of characters that define a search pattern. This pattern is used by string searching algorithms for find or replace text.

    It can be useful to validate an EMAIL address or an IP address.

    Regular expression tester

    This tool is an online regex checker, it allows to easily test and debug regex. This avoids wasting time writing the few lines of code needed to do the tests.

    This tool also allows you to share your regular expressions, this can be useful when you want to explain one of your regex problems (or its resolution) on a forum.

    Регулярные выражения

    Если вы когда-либо работали с командной строкой, вы, вероятнее всего, использовали маски имён файлов. Допустим, если хотели полностью удалить файлы в текущей директории, начинающиеся на букву «d», писали команду rm d* .

    В принципе, регулярные выражения — это схожий инструмент, однако более мощный. Он позволяет искать строки, проверять их на соответствие определённому шаблону и т. п. Англоязычное название — Regular Expressions либо просто RegExp. Можно сказать, что регулярные выражения — это язык, описывающий шаблоны строк.

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

    Основы синтаксиса

    Для начала отметим, что любая строка уже сама по себе — это регулярное выражение. Например, выражению Хаха будет соответствовать строка «Хаха» и лишь она. При этом стоит учитывать, что регулярные выражения регистрозависимы, а значит, «хаха» уже будет совсем другим выражением.

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

    Для экранирования используют , добавляя его перед спецсимволом.

    Набор символов

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

    К примеру, паттерну [abcd] соответствует любой из символов d, c, b или a.

    Большинство спецсимволов внутри набора не нуждается в экранировании, но применение перед ними «» не будет ошибкой. Нужно экранировать символы «^» и «», рекомендуется экранировать «]» и «-». Последний применяется для задания диапазонов, но об этом ниже.

    Если мы после «[» запишем символ «^», набор получит обратный смысл, а подходящим станет считаться любой символ, кроме тех, что указаны. К примеру, паттерну [^xyz] будет соответствовать любой символ, кроме «x», «y» и «z».

    Если вернуться к нашему случаю, то после написания [Хх][аоие]х[аоие] любая из строк «Хаха», «хихи», «хехе» и даже «Хохо» будет отвечать шаблону.

    Предопределённые классы символов

    Для ряда часто используемых наборов есть специальные шаблоны. Так, для пробела, табуляции и переноса строки применяют s , для цифр — d , для подчёркивания, символов латиницы — w . Когда нужно описать любой символ вообще, применяют точку — . .

    Если вы указанные выше классы напишете с прописной буквы (S, D, W), они поменяют смысл на противоположный.

    Кроме всего прочего, с помощью регулярных выражений можно проверить, где находится строка по сравнению с остальным текстом. Допустим, выражение b служит для обозначения границы слова, B — не границы слова, ^ — началa текста, $ — конца текста.

    Таким образом, паттерн bJavab в строке «Java and JavaScript» найдёт первые 4 символа, а паттерн bJavaB обнаружит символы c 10-го по 13-й.

    Диапазоны

    Иногда возникает необходимость обозначить определённый набор, включающий в себя буквы, к примеру, от «б» до «ф». Чтобы не писать [бвгдежзиклмнопрстуф] , вы можете задействовать механизм диапазонов, то есть написать лишь [б-ф].

    Механизм особенно полезен для русского языка в силу отсутствия конструкции, аналогичной w . Если хотите обозначить все буквы из русского алфавита, подойдёт паттерн [а-яА-ЯёЁ] . Учтите, что «ё» не включена в общий диапазон букв, поэтому её следует указывать отдельно.

    Квантификаторы в регулярных выражениях (указатели количества повторений)

    Что делать, когда в нашем «смеющемся» междометии окажется между буквами «х» более, чем одна гласная («Хаахааа»)? Подготовленное нами ранее регулярное выражение уже помочь не сможет. А значит, не обойтись без использования квантификаторов.

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

    Итак, благодаря квантификаторам, можно улучшить шаблон для тех же междометий, написав [Хх][аоеи]+х[аоеи]* . Теперь он распознает строки типа «Хааха», «Хихии», «хееех».

    «Ленивая» квантификация и регулярные выражения

    Представим, что у нас есть задача по поиску всех HTML-тегов в строке:

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

    Так происходит потому, что по умолчанию квантификатор в регулярных выражениях функционирует по, если можно так выразиться, «жадному алгоритму», то есть пытается вернуть самую длинную строку, которая отвечает условию. Проблема решается двумя способами: 1. Используется выражение ]*> . Оно запрещает правую угловую скобку считать содержимым тега. 2. Квантификатор объявляется «ленивым», а не «жадным». Для этого справа к квантификатору добавляется символ ? . Таким образом, при поиске всех тегов выражение обратится в .

    «Ревнивая» квантификация и регулярные выражения

    Порой, для повышения скорости поиска (например, если строка не соответствует регулярному выражению) алгоритму запрещают возвращаться к предыдущим шагам поиска в целях нахождения возможных соответствий для оставшейся части регулярного выражения. Это «ревнивая» квантификация. Квантификатор становится таковым при добавлении к нему справа символа + . Другое применение — исключение нежелательных совпадений. Таким образом, паттерну ab*+a в строке «ababa» соответствуют лишь первые 3 символа, но не соответствуют символы с 3-го по 5-й, ведь символ «a», находящийся на 3-й позиции, уже использовался для получения первого результата.

    Скобочные группы

    Для шаблона «смеющегося» междометия осталось всего ничего — учесть то обстоятельство, что буква «х» способна встречаться больше, чем один раз, допустим, «Хахахахааахахооо», да и вообще, слово может не заканчиваться на «х». Можно задействовать квантификатор для группы [аиое]+х , однако если мы просто укажем [аиое]х+ , квантификатор + будет относиться лишь к символу «х», но не к выражению целиком. Дабы это исправить, регулярное выражение следует взять в круглые скобки: ([аиое]х)+ .

    Итак, регулярное выражение преобразуется в [Хх]([аиое]х?)+ , причём в начале следует строчная либо заглавная «х», потом — ненулевое произвольное количество гласных, которые перемежаются одиночными строчными «х» (возможно, однако необязательно). Но это регулярное выражение решает проблему лишь частично, ведь под него попадут и такие строки, как, допустим, «хихахех». Но можно использовать набор изо всех гласных только единожды, а потом опираться на результаты первого поиска. Но как это сделать?

    Обратная связь — запоминание результата поиска по группе

    Результат поиска по скобочной группе сохраняется в отдельной ячейке памяти, а доступ к ней разрешён для применения в последующих частях регулярного выражения. Если вернуться к задаче поиска HTML-тегов на странице, давайте представим, что нужно не только найти теги, но и определить их названия. В данном случае поможет регулярное выражение .

    Вот результат поиска по всему регулярному выражению:

    А вот итог поиска по 1-й группе:

    Вы можете ссылаться на результат поиска по группе с помощью регулярного выражения n , в котором n — это цифра в пределах 1-9. К примеру, регулярному выражению (w)(w)12 отвечают строки «aaaa», «abab», однако они не соответствует «aabb».

    Когда выражение берётся в скобки лишь для использования в её отношении квантификатора, то сразу после первой скобки следует добавить ?: , допустим, (?:[abcd]+w) .

    С применением данного механизма мы легко перепишем всё регулярное выражение, приведя его к следующему виду:

    Перечисление

    Желаете проверить, соответствует ли строка хотя бы одному из шаблонов? Воспользуйтесь аналогом булевого оператора OR, записываемого посредством символа | . Здесь, под шаблон Лена|Одиночество попадают строки и «Лена», и «Одиночество».

    Удобно применять перечисления внутри скобочных групп. Так, регулярное выражение (?:a|b|c|d) абсолютно эквивалентно [abcd] . В этом случае 2-й вариант даже лучше из-за читаемости и производительности.

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

    Полезные сервисы по регулярным выражениям

    Проверить своё регулярное выражение и потренироваться можно на специальных сервисах: RegExr, Regex101, Regexpal.

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

    Также существует визуальный конструктор функций JS, предназначенный для работы с регулярными выражениями — это RegExp Builder.

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

    0 0 голоса
    Рейтинг статьи
    Читать еще:  Работа в эксель онлайн бесплатно
Ссылка на основную публикацию
ВсеИнструменты 220 Вольт