regulyarnyie-vyirazheniya-osnovyi (852744), страница 12
Текст из файла (страница 12)
google. com/p/re2/), либо отключать этот режим для некоторыхчастей регулярных выражений, создавая атомарные группировки.64Глава 4. Альтернативы, группы и обратные ссылкиОсновная цель, которую я преследую в книге, - это ознакомление читателяс регулярными выражениями. Вопросов производительности я почти не касаюсь, но именно с ними, по моему мнению, наиболее тесно связано использование атомарных группировок.В главе 5 речь пойдет о символьных классах.О чем вы узнаnи в rnaвe 4• Каким образом альтернативы обеспечивают возможность выбора между двумяи более шаблонами.• Какие существуют модификаторы опций и как они используются в шаблоне.• Какие виды подшаблонов существуют.• Использование захватывающих групп и обратных ссылок.• Использование именованных групп и ссылок на них.• Использование незахватывающих групп.• Что такое атомарная группа.На заметку• Adobe Air - кроссплатформенная среда выполнения, позволяющая использоватьHTML, JavaScript, Flash и ActionScript для создания веб-приложений, способныхвыполняться в качестве автономных клиентских приложений без использования браузера.
Более подробную информацию по этому вопросу можно получитьпо адресу http://www. adobe. com/products/air. html.• Python (http://www. python. org) - высокоуровневый язык программирования, имеющий собственную реализацию механизма регулярных выражений(http://docs/python. org/library/re. html).• .NET (http://www. microsoft. com/net) - программная платформа для компьютеров, работающих под управлением Windows, в которой также реализован механизм регулярных выражений (http:/ /msdn. microsoft. com/en-us/library/hs600312. aspx).• Более полное описание атомарных групп приведено на сайтах http://www.regularexpressions.
info/atomic. html и http://stackoverflow. сот/questions/6488944/atomic-group-and-non-capturing-group.Гnава 4. Аnыернативы, группы и обратные ссыnки65ГЛАВА SСимвоnьные кnассыВ этой главе речь пойдет о символьных классах, также известных как скобочныевыражения. Символьные классы упрощают сопоставление с одиночными символамиили последовательностями символов. Для многих классов предусмотрены сокращенныеформы записи, называемые сокращениями. Например, сокращение \d эквивалентноследующему классу:[0-9]которому соответствует любая одиночная цифра из диапазона 0-9. Классы способныобеспечивать именно ту степень специфичности, которая вам необходима. В этом смысле они более универсальны, чем символьные аббревиатуры.Для выполнения приведенных ниже примеров можете использовать любой удобныйдля вас процессор регулярных выражений. Однако приведенные ниже описания примеровотносятся к веб-приложению Rubular, используемому совместно с браузером Firefox,и настольному приложению Reggy.Введите в области веб-страницы, предназначенной для размещения целевого текста,следующую строку.о..
# $ % &1981(2* + ' 3/4567<> ? @А В С D Е F G н I J к L М N о р Q R s т u v w х у zл[ \ ]а Ь с d е f g h i j k 1 m n о р q r s t u v w х у z{ 1 }-Вам вовсе не обязательно вводить все вручную. Этот текст хранится в файле asciigraphic.txt, включенном в архив примеров.Мы начнем с использования символьного класса для поиска определенных буквлатинского алфавита, а именно гласных:[aeiou]Эти гласные должны выделиться в расположенной ниже поля ввода текстовой области(рис. 5.1 ).
А как бы вы организовали поиск гласных, записанных в верхнем регистре, иливсех гласных независимо от регистра?+С' 11· --rubul1н.comRubular-а Ruby regular expression ed1\or' • ' $ � ' • ( 1 • + • -'с16•А 9( \i. b17< "' > ., 'С D � F" G fl1 .c <1;!qh{ 1 j -2аЗ9/4, � ; � ;, " • r 1 " -t , -5О-I J Х L М 11 О Р ; • S Т U ',/ � Х 'i Z:i.Jklr- 11 op q : 'l " \1 V W X '/ :!.'• <"18> .,.2•З146€ABCDZ.FGfl! JJ: LY.NOP('.IS70V);Y.YZ1 \ 1 АlccctИfqЬ.B1кlmnlгq.1:!ltlv ... x�:ii • J -� :ge,, qLнcJ.: refereпce-·-•• �---"-->Cr�"'--._ --"-"� ....- J_.....__,..-..._......__...._-__,,_,..__,_,е-,а.,.�..,_.,_,,____.,_....,._._._•"- • •,1 ...�.Рис. 5. 1. Использование символьного класса в веб-приложении RubularВ классе можно указывать целый диапазон символов:[a-z]Этому классу соответствует любая одиночная буква нижнего регистра от а до z.Попробуйте выполнить поиск с некоторым поддиапазоном букв, например букв от а до f:[a-f]Конечно же, ничто не мешает вам указать в классе диапазон цифр:[0-9)или же их поддиапазон, например цифры 3, 4, 5 и 6:[3-6)А теперь расширим горизонт.
Если требуется выполнить сопоставление для четныхчисел в диапазоне от I О до 19, скомбинируйте два класса, расположив их один за другим:\b[l] [24680) \ЬМожете пойти еще дальше и организовать поиск всех четных чисел в диапазоне от Одо 99 (надеюсь, вы еще помните из школьного курса математики, что нуль также можносчитать четным числом):\Ь[24680] \bl \b[l-9) [24680) \ЬЕсли бы вам потребовалось создать символьный класс для сопоставленияс шестнадцатеричными цифрами, то как бы вы это сделали? Даю подсказку:[a-fA-F0-9)68Глава 5.
Символьные классыВ классах разрешается использовать символьные сокращения. Например, для сопоставления с пробельными и словарными символами можно создать следующий класс:[\w\s]который дает тот же результат, что и такой класс:[ a-zA-Z \t\n\r]но записывается гораздо короче.Инвертированные симвопьные кпассыПоскольку этот синтаксис вам уже встречался, я буду краток. Инвертированномусимвольному классу соответствуют символы, которые не перечислены в классе.Например, если вы не хотите находить соответствия гласным, можете использоватьследующий класс (проверьте самостоятельно, как это работает в RegExr, а затем сравнитеполученный результат с рис.
5.2):По существу, указывая циркумфлекс ( л) в начале класса, вы сообщаете движкурегулярных выражений: "Следующие символы мне не нужны". (Циркумфлекс должензаписываться в самом начале класса.)R•gEдSampJ..sMatc.h,,Communftyt showa·U{"••lou].. 5 .... &J'()��(,,1(о 1111Ну Sav-.d1 211 '1 З'I 11�' 1 1< ..
"'� ф>\wl il 1 6111 i7!,11 SrABCDEFGH I D l<iLMNO PQR STU VWXY:Z( J .... _.•J•bcdefgl,ljl<Jmnopqo•t.uv•,xy,{ 1} �IS\W\d\D\s\S[АВС)[�две]Match� •n'I ch•r•cter ехсер� for linebrea� if dotall ,s f•ls@R@gExp: /( ..... -ae,ou]/gpattem: { "" aeiou]flags: ОО capturing groups:Рис. 5.2. Использование uнвертuрованно,00 символьного класса в npwroжeнuu RegExrГлава 5. Символьные классы69Объединение и разностьо,.,,,,PreferencesAppearance/j Mat<:hed string colorО Colorlze sub-matchesStartup DefaultsО Use clipboard as Regular ExpressionС) Use dipboard as Testing StringUpdates� Check for updates on startupRegular Expresslon Syntax[Javaф�Рис.
5.3. Вкладка Preferencesпрuложенuя ReggyСимвольные классы ведут себя подобно наборам.В действительности другое название символьногокласса - символьиый набор. Эта функциональностьподдерживается не всеми реализациями. Однаков Java она поддерживается.В приведенном ниже примере используетсянастольное приложение Reggy, предназначенноедля компьютеров Мае (см. раздел "На заметку").Перейдя на вкладку Preferences (Параметры), показанную на рис. 5.3, я выбрал в списке RegularExpression Syntax (Синтаксис регулярных выражений) вариант Java, а затем, используя список Font(Шрифт) на вкладке Format (Формаг), которая на рисунке не показана, установил размер шрифта 24 пункта для лучшей различимости текста.Для объединения двух наборов можно использовать выражения наподобие следующего:[0-3(6-9]]Данному регулярному выражению соответствует любая из цифр от О до 3 и от 6 до 9.Результат в окне приложения Reggy показан на рис.
5.4.Ql""IOReggy[0-3(6-9]].! 11 # $ % & 1 ( ) * + ' _ • /О 1 2 3 4 5 6 7 8 9:;<=>?@АВС D EFGH IJ KLMNO PQRSTUVWXYZ'[ \] л abcdefghijklmnopqrstuvwxyz{ 1 }-� Mo1tch AIJО Mзldlc Usa О t.lulli!h)eа lt!lltdlt.s F'olWldРис. 5.4. Объединение двух символьных наборов в Reggy70Гnава 5. Симвоnьные кnассыДля поиска соответствий символам, которые имеются только в одном из двух наборов(а по сути - символам, принадлежащим к разности наборов), можно использоватьвыражения наподобие следующего:л[a-z&& [ m-r]]которому соответствует любая буква от а до z за вычетом букв от m до r (рис. 5.5).еnnReggy[a-z&&[лm-r]]! 11 # $ % &1 ( )*+! • ' /О 1 2 З 4 5 6 7 8 9:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[ \] л abcdefghiJklmnopqrstuvwxyz{ 1 }-&, -..atd, Afl� M�dl C1seО Mul11l1ne11•dРис.
5.5. Получение разности двух си.мвольных наборов в ReggyСимвоnьные кnассы POSIXPOSIX (РогtаЫе Operating System Interface for UniX) - семейство стандартов,поддерживаемое IEEE. Оно включает стандарт регулярных выражений (ISO/IEC/IEEE9945:2009), который предоставляет набор именованных символьных классов следующеговида:[[:ХХХХ:]]где хххх - имя, например digit или word.Алфавитно-цифровые символы (буквы и цифры) представляет следующий класс:[[:alnum: J JРезультат его применения к пробному тексту в окне веб-приложения Rubularпредставлен на рис. 5.6.Глава S.
Символьные классы71+E"J Rubul,11r: "RuЬy regular а. ..+rubular.com4':iRubularа Ruby regular express1on ed�or{ { .alnшn J 11о6•• f $ \ " •l"• "- ,. ,. ., <,(�е� + , -з9..�A.BC D?: ':;" GA : .JP:tltN OP:R.sru v1tXYZ1' 1• b t' d;;tQh J. )k lm n op q r • t. w v 1,1 x � �(1)-2.00 •...=-IIDi""i'···н··-··1111111111аов111в1оа111.. .. > ') �н���a111111gaa11111a111a111 •Regex qulCk referer!i;eРис. 5.6. Применение класса Ш1фавитно-цифровых символов POS/X в RubularВместо этого класса достаточно использовать символьное сокращение \ w. Что прощедля ручного ввода: символьный класс POSIX или сокращение? Вы понимаете, к чемуя клоню: выигрывает то, что короче.
Признаюсь, я не очень часто использую классыPOSIX. И тем не менее вам следует знать об их существовании.Для представления алфавитных символов в верхнем и нижнем регистре используйтеследующий класс:[ [:alpha:]]Весь диапазон символов ASCII представляет следующий класс:[ [:ascii:]]Разумеется, также существуют инвертированные классы:Следовательно, мя представления неалфавитных символов можно использовать такойкласс:[ [: лalpha:] ]Для представления пробелов и символов табуляции используется такой класс:[ [: space: ] ]Для представления всех пробельных символов предназначен следующий класс:[[:Ьlank:J]Полный перечень символьных классов POSIX приведен в табл. 5.1.72Глава S.