regulyarnyie-vyirazheniya-osnovyi (852744), страница 6
Текст из файла (страница 6)
tale,RegExp,'0·9] gpattern:0-9)fl.ags: gО upЬ,r,n9 groups:Рис. 2.3. Поиск вхождений цифр в окне RegExr с помощью символьного класса [ 0-9]Введите в верхнем поле RegExr выражение [ 12 ] и проанализируйте результат. Сокращенная форма записи класса для цифр в виде метасимвола \d короче и проще, но необладает возможностями и гибкостью символьных классов. С помощью класса можноточно указать, вхождения каких цифр требуется найти. Я использую символьные классыв тех случаях, когда не могу использовать сокращение \d (оно не всегда поддерживается) или когда требуется избирательно указывать цифры, подлежащие сопоставлению. Вовсех остальных случаях я использую сокращение \d в силу его простоты и компактностисинтаксиса.Соответствие нецифровым симвояамКак это свойственно многим символьным сокращениям, определяемые ими закономерности соответствия можно легко обратить (для этого существует техническийтермин - инверсия). Например, для того чтобы задать сопоставление с символами, неявляющимися цифрами, достаточно использовать следующее символьное сокращение(с записью О в верхнем регистре):\DАпробируйте его с помощью приложения RegExr.
Использование буквы О в верхнем регистре вместо нижнего позволяет находить вхождения нецифровых символов(рис. 2.4).Гnава 2. Сопоставnение с простыми wабnонами31S RegExrSilmpt•.sМ.·tch\DНу SavedCommun1ty} show aU� globe.lU lgnor�as�LJ extendedLJ dot�IIL.J multilin@'",.,,\dHcvl а бhip J hi!Иng'\,.a'!sed tne Unei vJa!s driVe'n bly StDrms 1:о �е rooldd::нтЬу Ь::>w.ands the So\..11:ti Polie;,.anlc:I hov/from 1:h,м,а! sh,e 'rn.ade h.ir:Ь:iu)'S&to the tropk.al Uзtih..ide ьf the Great \:)'adflo Oc.ean: and pf tt,4e strangethlngs thattЬef�I; l!ind int v"1at.
manner tne �cyent t,,1arjner'e c:ame Ьасk 00hi!. oW'I Oo\.inЬy,,.\D\S[АВС][�•всJ1 I Jib � зn anr;y'ent:' Marinere{,2 1 j And1 he sЬoppeth <in� of, lt,ree':3 !I 1re.y t:t,ytong ,gi-eyl.Ьe�� 8nd thyj9Jittlerfng 111у.е'7'NoW )'A,,erero\oia s.tr,pp4!St. me?I[a·z]M•tcheir •ny cha.-.ct�r. e.xc•pt for HneЬreaks: 1f dotall 1а falи.! Виt st:ill he holds the i...edding-guestz.rТhеге Wi!!S а Ship, q\Joth her-r•нау� ifi t:t,ou•r.t1 got а laughsome ь.1.._RegExp� /\D/gpattl!-rn: \DRag.s: gО captunng groups·Рис. 2.4.
Поиск вхождений нецифровых символов в окне RegExrс помощью символьного сокращения \ DСоответствие сnоварным и несnоварным симвоnамВведите в RegExr вместо \ О следующее символьное сокращение:\wВ нижнем текстовом поле выделятся все символы из числа тех, которые могут входить в состав слов (при условии, что по-прежнему установлен флажок global).
Различиемежду символьными сокращениями \D и \w состоит в том, что сокращению \0, помимобукв и символа подчеркивания, соответствуют также пробельные символы, знаки пунктуации, кавычки, дефис, прямая косая черта, квадратные скобки и ряд других символов,тогда как сокращению \w соответствуют только словарные символы, т.е. те, которые могут входить в состав слов: буквы, цифры и символ подчеркивания.Для текстов на английском языке сокращение \w фактически означает то же самое,что и следующий символьный класс:[_a-zA-Z0-9]Этот класс ограничен диапазоном символов, входящих в набор ASCII, за исключением управляющих символов.
Более подробно о сопоставлении с символами, числовые коды которых выходят за пределы набора ASCII, вы узнаетев главе 6.32Глава 2. Сопоставление с простыми шаблонамиДля поиска вхождений несловарньtх символов, т.е. тех, которые не относятся к категории словарных, используется буква W в верхнем регистре:\WЭто символьное сокращение совпадает с пробельными символами, знаками пунктуации, а также символами других типов, которые не встречаются в данном примере. Приведенное выше сокращение эквивалентно следующему символьному классу:[ л _a-zA-Z0-9]Символьные классы обеспечивают заведомо более точный контроль соответствий, новполне может быть, что вы просто не захотите или не сочтете нужным вручную вводить длинный список символов.
В подобных ситуациях срабатывает, как говорят, принцип "минимизации клавиатурного ввода" ("fewest keystrokes win"). В других же случаяхдля того, чтобы в точности обеспечить получение нужного результата, без указания списка конкретных символов не обойтись. Как именно следует поступить, вы решаете в зависимости от ситуации.Для сравнения проверьте, как работают в RegExr следующие два символьных класса:[Л\W]иУловили разницу?В табл. 2.1 приведен обширный список метасимволов, используемых в качестве сокращенной формы записи символьных классов. Не каждое из приведенных сокращенийработает во всех процессорах регулярных выражений.Таблица 2.1.
Символьные сокращенияСимвольное сокращениеОписание\а\Ь[\Ь]\ВЗвуковой сигнал\схУправляющий символ\d\DЦифра\d ххх\f\r\nДесятичное значение кода символа\о хххВосьмеричное значение кода символа\s\SПробел (пустой символ)Граница словаВозврат на шаг (забой)Не граница словаНе цифраПеревод форматаВозврат кареткиПеревод строкиНе пробел (непустой символ)Глава 2. Сопоставление с простыми wабnонами33Окончание табл. 2.1Символьное сокращениеОписание\tСимвол горизонтальной табуляции\vСимвол вертикальной табуляции\wСловарный СИМВОЛ\WНе словарный символ\0Пустой символ (Null)\х ххШестнадцатеричное значение кода символа\и ххххСимвол в кодировке UnicodeСоответствие пробеяамДля задания соответствия пробелам используется следующее символьное сокращение:\sВведите его в RegExr и посмотрите, какие символы окажутся выделенными в нижнемтекстовом поле (рис.
2.5). Тот же результат можно получить с помощью следующего символьного класса:[ \t\n\r]Иными словами, этому классу соответствуют:пробелы;символы горизонтальной табуляции;символы перевода строки;символы возврата каретки.••••ь_:.В приложении RegExr выделяются цветом пробелы и символы табуляции, ноне символы перевода строки и возврата каретки.�Как нетрудно догадаться, у символьного сокращения \s имеется "партнер': Для поиска соответствий непробельным символам используйте следующее сокращение:\SЕму соответствует все, что не является пробелом. Тот же результат можно получитьс помощью такого класса:[ л \t\n\r]или же такого:Апробируйте эти выражения в RegExr и проверьте, какие результаты при этом получаются.Кроме тех символов, которые соответствуют сокращению \s, существуют другие, менее известные пробельные символы. Символьные сокращения для этих, а также другихредко используемых символов приведены в табл. 2.2.34Глава 2.
Сопоставление с простыми wабnонамиRe9ExrR.e:placeHatchSamplest\sMySave:dC.ommunitys.how al•J� glcbalТНЕ RIME OF тне ANC'VENТ МАЯ.[NЕRЕ. IN SEV� PARTS.wARGUMENТ\dHow • Shlp t,aving passed the L,ne was driven Ьу Storms to the roldCount,y towards the South Pole; and hov, from th•nc.e s;hli! mad• her courseto the troplc.iil L8titude of the Great Pacific Oet!an; .and of the strangethlngs that befell1 and ln what manner the Ancyent Marinere came back tohis о\М'I Ccuntry.J.l2 1D\s\S[АВС][ЛАВС][a-z]lt 1s an ancyent Mвrinere,And he stoppeth опе of U,ree:"Ву thy long grey Ь.ard .and thy glitt:ering еуе"Nov� wherefore stoppest me ?Metch�s an-1 ch11rarter.
ексерt. for llnl!!bre•k.s 1f dot.зll ,s false.But sbll hl! holds the wedding-guest-There "'85 а Shlp, quoth he-'"Nay. lf thou'st got а laughsome t:.le,RegExpi1gpattern: sftap: gО c.apturu'lg grou,-s1Рис. 2.5. Поиск всех вхождений пробельнь1х символов в окне RegExrс помощью символьного сокращения \ sТаблица 2.2. Символьные сокращения дпя пробельных символовСимвольное сокращениеОписание\fПрогон страницы\hГоризонтальный пробел\ННе горизонтальный пробел\nПеревод строки\rВозврат каретки\tСимвол горизонтальной табуляции\vСимвол вертикальной табуляции (вертикальный пробел)\VНе вертикальный пробелСоответствие произвопьному симвопуСуществует способ задать соответствие любому одиночному символу с помощью регулярных выражений, и это достигается за счет использования символа точки (U+002E).За исключением некоторых особых ситуаций, точке (.
) соответствует любой символ,кроме символов, обозначающих конец строки.Глава 2. Сопоставление с простыми шаблонами35Отключите в приложении RegExr режим глобального поиска, сняв флажок global. Этоприведет к тому, что сразу же после того, как в целевом тексте будет найдено первое совпадение, регулярное выражение прекратит свою работу.Теперь для поиска вхождения произвольного одиночного символа достаточно ввестив верхнем текстовом поле RegExr символ точки.Как показано на рис. 2.6, в качестве первого символа, соответствующего точке, регулярное выражение находит символ Т.RegExrRept•c•"o1tchLJ glabolТНЕ RIME OF ТНЕ Al�CYENT MARHJERE, IN SEVEN PARTS.ARGUMEN'Т,'"'\dHow а Ship ho1ving pass:ed the Line YJaS driven bv 51:orms t:o tha cold\ОCountry towards tl,e South Pole: and how from thence she made l,er cours•to the trop/cal latltude of the Great Padtlc Oc:ean: and of the stтangethlngs that be(ell: •nd 1n N'lat manner the Ancyent Marinere c•m• b•c.k tohis OYl'I Country\S[АВС}!.[ АВС)It is an •ncyent Mar,nere,And he .stoopeth one of three:"Bv thv lon9 9rey b•o1rd .ind thy 91il:ter1ngatch•• •n'f c.harader ex:..pt for l,ne•v•Ь.rl!ak5 lf dot.illl ls.
fal1•"Now •.tierefore stoppest me"Re.gExp: JJJNitl.ll!rn:Aag,:О Cilpturlng 9"0UJ)'SIАРис. 2.6. Поиск произвольного одиночного символа в окне RegExrс помощью символа "точка" (. )Если нужно обеспечить совпадение шаблона с целой фразой ТНЕ RIME, используйтерегулярное выражение, состоящее из восьми точек:Однако такой способ непрактичен, в связи с чем я рекомендую применять подобныедлинные последовательности точек как можно реже или вообще отказаться от них. В данномслучае вместо ввода восьми точек лучше воспользоваться следующим квантификатором:. { 8}который обеспечит совпадение регулярного выражения с первыми двумя словами целевого текста и пробелом между ними, хотя это и делается довольно топорно.
Чтобы вамстало понятно, почему я назвал этот способ "топорным", вновь включите глобальныйрежим поиска, установив флажок global, и вы убедитесь в том, что в действительностиданный способ оказывается почти бесполезным. В результате применения последнего регулярного выражения к целевому тексту выделяются последовательности, состоящие из36Глава 2. Сопоставление с простыми шаблонамивосьми произвольных символов каждая,в которые не попадают лишь последние символы некоторых строк текста.Применим другой подход, в котором используется привязка к границам слов и их начальным и последним буквам. Введите в верхнем текстовом поле окна RegExr следующий текст:\ЬА. {S}T\bЭто выражение характеризуется чуть более высокой специфичностью. (Попытайтесьтрижды произнести вслух слово специфичность.) Ему соответствует слово ANCYENT устаревшая форма написания слова ancient.