regulyarnyie-vyirazheniya-osnovyi (852744), страница 3
Текст из файла (страница 3)
В частности, к их числу относятсятекстовые редакторы ed, sed и vi (vim), а также утилита grep и интерпретируемый С-подобный язык АWК. В то же время способы реализации регулярных выражений в каждомконеретном случае имели свои особенности.В этой книге я придерживаюсь индуктивного подхода, т.е. мы будем переходить от частного к общему. Поэтому чаще всего буд ут приводиться сначалапримеры и лишь затем - соответствующие теоретические выкладки.Регулярные выражения имеют репутацию трудной темы, однако все зависит от того,как приступить к их изучению.
Существуют, например, совсем простые регулярные выражения:\dгде метасимволу \d соответствует любая одиночная цифра от О до 9. Постепенно усложняя это регулярное выражение, мы придем в конце главы к выражению следующего вида,которое можно использовать в качестве надежного шаблона для поиска телефонных номеров в формате записи, принятом в США и Канаде:л (\ (\d{З} \) 1 Л\d{З} [ .-] ?) ?\d{З} [ .-] ?\d{4}$Этому формату соответствуют номера, состоящие из 10 цифр, причем разрешаетсязаключать территориальный код в круглые скобки и использовать дефисы или точкидля разделения отдельных групп цифр.
(Круглые скобки должны быть обязательно парными; использование одиночных круглых скобок не допускается.)В главе 10 вы ознакомитесь с более сложным регулярным выражением для поиска телефонных номеров, но для целей текущей главы нам вполне хватити того выражения, которое представлено выше.Если вам пока что непонятно, как все это работает, то не огорчайтесь: чуть позжеэто выражение будет детально проанализировано. Даже если вы будете всего лишь повторять примеры (и не только в этой главе, но и по всей книге), то вскоре составлениерегулярных выражений станет для вас привычным делом.
Готовы сами в этом убедиться?В этой книге я иногда буду использовать символы Unicode, представленные кодовымиточками - шестнадцатеричными числами, состоящими из четырех цифр. Кодовые точки записываются в виде U+OOOO. Например, запись U+002E представляет кодовую точкудля символа точки (. ).Припожение RegexPalПозвольте представить вам сайт RegexPal (http://regexpal.com). Перейдитена этот сайт в любом браузере, например Google Chrome или Mozilla Firefox. Примерныйвид страницы, которую вы должны увидеть, представлен на рис. 1.1.хRegex Testerсregexpal.con1pal п.1 -1 - �Ja,-a5cript r€"g1llar �xpression testerCase insens1trve J"$ match at line bn::aks�g•x8uddyAndroidRegex ВооkDot matc/1es all tVersion HislDryOptionsBl090[1ic.k ReferenceNeed 11юrе power? �t � а po-,.,erful rege:t tester that 1nso1red Re-QexPaJ.Rouno out your rustery over re-Qe•-,.
tt, � and �Рис. 1.1. Вид страницы RegexPal в окне браузера Google ChromeНа странице имеются два текстовых поля: верхнее и нижнее. Верхнее предназначенодля ввода регулярных выражений, нижнее - для целевого текста. Целевой текст - этонабор строк, к которым вы хотите применить регулярное выражение." ...'�.'16В конце этой и каждой из последующих глав находятся разделы "На заметку",в которых содержатся дополнительные сведения об обсуждавшихся в главетехнологиях и приводятся ссылки на дополнительные источники информации .Размещение подобных сведений в конце главы позволяет не отвлекаться на обсуждение второстепенных деталей в основном тексте и тем самым способствует непрерывности изложения более важного материала.Глава 1.
Что такое регулярные выраженияСоответствие тепефонному номеруМы приступаем к нахождению соответствий шаблону телефонного номера с помощьюрегулярных выражений. Введите в нижнем текстовом поле веб-приложения RegexPal следующий телефонный номер:707-827-7019Это номер телефона издательства O'Reilly Media.Попытаемся составить регулярное выражение, позволяющее находить вхожденияэтого номера в произвольном тексте. Это можно сделать множеством способов, но мыначнем с простейшего. Введите в верхнем текстовом поле сам номер в том же виде, в каком ввели его перед этим в нижнем поле (ради бога, не торопитесь вздыхать):707-827-7019После того как вы это сделаете, приложение автоматически подсветит (выделит желтым цветом) весь номер, введенный в нижнем окне, от первой цифры до последней(рис.
1.2). Если у вас это получилось, считайте, что вы уже используете регулярные выражения!)(Re99: Т e.sterс�<", r�"-,.-,....,....{,o"'"l!"'"��)'f,-�,�.,'f-'1�"���01/!'IX'!Iregexpal.compal 0.1.; - а ,Ja,·aScript regu]ar •чiression teS1er RegexOuddyCase 1nsens1t1Ve 1"� match at line breaks t •Dot m.:itches all fAndroidRegex Вооk , VefOion llisiorytP-::qE,oOpdonsBlogQ<1ick ReferenceNeed more power? C--et RenexВuddy. а po*rful reoe.( testsrthat lnsp1red Re9e,PalRound oul your master1 OYer rege, "· tn � anCI PO\verGREPРис.
1.2. Десятизначный телефонный номер,подсвеченный в окне веб-приложения RegexPalВо всех случаях, когда в книге говорится о цвете элемента рисунка или снимка экрана, например, о цвете, которым выделяется найденный текст в окнеRegexPal, вы должны понимать, что речь идет о цвете, отображаемом в окнеприложения или на экране электронной книги. На страницах печатного издания книги наш мир будет ограничен оттенками серого, за что я заранее приношу свои извинения.Глава 1.
Что такое регулярные выражения17В данном случае для поиска подстрок, соответствующих шаблону, мы использовалирегулярное выражение в виде строкового литерала. Строковый литерал - это буквальное представление строки.А теперь удалите номер в верхнем окне и введите вместо него одну только цифру 7.Заметили изменения? Подсвеченными оказались только цифры 7. Литеральному символу (числу) 7 в регулярном выражении соответствует любое из четырех вхождений цифры 7 в целевом тексте.Задание соответствия цифрамс помощью симвопьных кпассовЧто если вы хотите найти в телефонном номере все цифры за один раз? Иными словами, как задать соответствие каждой из цифр номера, не прибегая к последовательномуперебору конкретных значений?Вновь введите в верхнем поле следующую строку в том виде, как она приведена:[0-9]В результате все числа (точнее, цифры) в нижнем поле выделятся попеременно желтым и голубым цветом.
Выражение [ 0-9] означает для процессора регулярных выражений следующее: "Найти совпадение с любой цифрой, принадлежащей к диапазону 0-9':Квадратные скобки не участвуют в сопоставлении литералов регулярного выраженияс целевыми строками, поскольку обрабатываются особым образом как метасимволы. Метасимволы имеют специальный смысл в регулярных выражениях и представляют зарезервированные значения.
Последовательность символов, заключенная в квадратные скобки,называется символьным классом (или символьным набором). Символьному классу соответствует любой одиночный символ из числа тех, которые заключены в квадратные скобки.Можно более точно ограничить набор допустимых цифр, указав их конкретный список:[012789]Введите это регулярное выражение в верхнем текстовом поле.
Ему будут соответствовать не любые цифры, а только те, которые входят в список, т.е. О, 1, 2, 7, 8 и 9. И вновьв нижнем поле чередующимися цветами будут выделены все цифры номера.Для представления любого десятизначного телефонного номера, отдельные группыцифр которого разделены дефисами, можно было бы использовать следующее выражение:[0-9] [0-9] [0-9]-[0-9] [0-9] [0-9]-[0-9] [0-9] [0-9] [0-9]Это регулярное выражение вполне функционально, но чересчур громоздко.
Гораздоболее элегантное решение данной задачи обеспечивают символьные сокращения.Испопьзование симвопьных сокращенийЕще один способ представления произвольной одиночной цифры, с которым вы ужеуспели ознакомиться в начале главы, заключается в использовании метасимвола \d, которому, как и регулярному выражению [ 0-9] , соответствует любая арабская цифра.
Регулярные выражения подобного типа, обеспечивающие компактную форму записи целыхклассов символов, называют символьными сокращениями или просто сокращениями. (Дляних существует также другое название - символьные маски, но, поскольку последний18Гnава 1. Что такое регуnярные выражениятермин может вносить некоторую путаницу, я избегаю его использования. Более подробные объяснения буд ут даны немного позже.)В качестве регулярного выражения, совпадающего с любым телефонным номером,представленным в описанном ранее формате, можно было бы использовать следующеевыражение:\d\d\d-\d\d\d-\d\d\d\dПовторение последовательности символов \d три или четыре раза подряд в точностисоответствует группам, состоящим из трех или четырех следующих подряд цифр.
Дефисиспользуется здесь как литеральный символ, участвующий в сопоставлении шаблонас целевым текстом.Включение дефисов в регулярное выражение - не единственный способ сопоставления с дефисами в телефонном номере. Для этой цели можно также использовать экранированный символ D в верхнем регистре (\D), которому соответствует любой символ, неявляющийся цифрой.Вот как можно использовать сокращение \D вместо литерального дефиса:\d\d\d\D\d\d\d\D\d\d\d\dМожете проверить, что и в этом случае в нижнем текстовом поле выделится весь телефонный номер, включая дефисы.Соответствие произвоnьному одиночному симвоnуДля представления дефисов в регулярном выражении можно было бы также использовать символ точки (.
):\d\d\d.\d\d\d.\d\d\d\dЗдесь точка, по существу, играет роль группового символа, совпадающего с любым одиночным символом (за исключением символа конца строки при определенных условиях).Этому регулярному выражению будут соответствовать телефонные номера, в которыхв качестве разделителя может использоваться не только дефис, но и символ процента(%):707%827%7019символ вертикальной черты ( 1 ):707182717019и вообще любой другой символ.'Как уже отмечалось, символ точки не всегда будет совпадать с символом новойстроки, таким, например, как символ перевода строки (U+OOOA). И все же су...·:· ществуют способы добиться того, чтобы точке соответствовал также и символновой строки, о чем будет говориться далее.,'(.Захватывающие группы и обратные ссыпкиСейчас мы составим регулярное выражение, которое совпадает с начальной частьютелефонного номера из нашего примера, используя для этой цели захватьtвающую группу, а затем сошлемся на содержимое этой группы с помощью обратной ссылки.
СоздадимГлава 1. Что такое регулярные выражения19захватывающую группу, заключив сокращение \d в круглые скобки, а для ссылки на содержимое, захваченное этой группой, используем переменную \1:(\d)\d\lПеременная \1 ссылается на содержимое, захваченное (сохраненное) группой. Такимобразом, это регулярное выражение обеспечивает совпадение с префиксом 7 07 телефонного номера. Проанализируем отдельные составляющие этого выражения.• Группа ( \d) совпадает с первой цифрой номера (7) и запоминает ее.• Сокращение \d совпадает со следующей цифрой номера (О), но не запоминает ее,поскольку не заключено в скобки.• Переменная \1 ссылается на захваченную цифру (7).Данное выражение совпадает только с территориальным кодом.
Не огорчайтесь, есливам пока что не все до конца понятно. В этой книге вы еще не раз столкнетесь с примерами использования групп.Теперь мы можем записать регулярное выражение для сопоставления с полным телефонным номером, используя одну группу и несколько раз ссылаясь на ее содержимое:(\d)0\1\D\d\d\1\D\1\d\d\dИ все же это выражение еще не выглядит достаточно элегантным. Попытаемся улучшить его.Испопьзование квантификаторовНиже представлен еще один вариант регулярного выражения для сопоставления с телефонным номером, записанный с использованием другого синтаксиса:\d{ЗJ-?\d{ЗJ-?\d{4}Числа в фигурных скобках сообщают процессору регулярных выражений точное количество вхождений цифр, которое требуется для совпадения. Фигурные скобки с заключенными в них числами - это одна из разновидностей квантификаторов.