regulyarnyie-vyirazheniya-osnovyi (852744), страница 14
Текст из файла (страница 14)
В последнем случае дополнительный знак процента требуется также при использовании кодировки Uпicode 1 •Например, выражение\351или\%0351приводит к тому же результату, что и выражение\u00e9или\%u00e9Проведите эксперимент с текстом Вольтера в приложении RegexPal. Вы обнаружите,что коду \351 также соответствует буква е, но при этом он короче своего шестнадцатеричного аналога.Поиск соответствий свойствам симвоnов UnicodeВ некоторых реализациях регулярных выражений, например в Perl, при сопоставлении текста с шаблоном допускается использовать свойства символов Unicode.
К числутаких свойств относится, например, принадлежность символа к буквам, цифрам или знакам пунктуации.Сейчас я познакомлю вас с ack - инструментом командной строки, написаннымдля Perl, который во многом напоминает grep (http://betterthangrep.com). Маловероятно, что он установлен в вашей системе, поэтому вы должны загрузить и установить его самостоятельно (см. раздел "На заметку").Для работы с этим инструментом я выбрал в качестве примера отрывок из оды "К радости" (''An die Freude"), написанной (разумеется, на немецком языке) Фридрихом Шиллером в 1785 году.IСм. также обсуждение по адресу http: //www.
ore1lly. com/ са talog /errata. csp? 1sbn=97814 4 939268 О. - Примеч. ред.Глава 6. Сопоставление с символами Unicode и другими символами79An die Freude.Freude, schoner Gotterfunken,Tochter aus Elisium,Wir betreten feuertrunkenHimmlische, dein Heiligthum.Deine Zauber blnden wieder,was der Mode Schwerd getheilt;Bettler werden Fйrstenbriider,wo dein sanfter Fliigel weilt.Seid umschlungen, Millionen!Diesen KuB der ganzen Welt!Brйder, йberm SternenzeltmuB ein Iieber Vater wohnen.В этом отрывке есть несколько интересных символов, выходящих за пределы области кодов ASCII. Для выполнения операций поиска в этом тексте мы будем использоватьсвойства.
(Если вас интересует перевод данного фрагмента, можете найти его в Bикипeдии: https: / /ru. wikipedia. org /w i ki /Oдa_ к_paдocти)Используя ack в командной строке, вы, в частности, сможете задать поиск символов,обладающих тем свойством (property), что они являются буквами (Letter):ack '\pL' schiller.txtЭта команда выделит в тексте все буквы. Если вас интересуют буквы нижнего (lower)регистра, воспользуйтесь следующей командой:ack '\p{Ll}' schiller.txtФигурные скобки обязательны.
В случае букв верхнего (upper) регистра команда будет выглядеть так:ack '\p{Lu}' schiller.txtДля указания символов, не обладающих заданным свойством, используется буква Рверхнего регистра:ack '\PL' schiller.txtЭта команда выделит в тексте все символы, не являющиеся буквами.Следующая команда выделит все символы, не являющиеся буквами нижнего регистра:ack '\P{Ll}' schiller.txtА эта команда выделит все символы, не являющиеся буквами верхнего регистра:ack '\P{Lu}' schiller.txtМожете повторить эти операции в друтом онлайновом тестере, перейдя в браузерепо адресу http: / /regex.
larsolavtorvik. сот. На рис. 6.4 показан шиллеровскийтекст, в котором аналогичным образом были выделены все букв ы нижнего регистра.80Глава 6. Сопоставление с символами Unicode и другими символами'�' -1' ,,'\'''\, ''.• • '• ••�,�,�regex.larsolavtorvik.coniregexO 96�ttern 1s1art and end slashes Vrlll Ье ad(Sed \\hen neede(S)lp{U}Replacemt>ntSubjectAn die fl"eude:Freude, :.c"ioner G6tterft.1nken,Tochte,.
•us t=Hsiu,.,..!ir betreten feuertrunkenHil\lМHIChe, de:in Heiligthun.Deine Zauber Ьinden wiedн,,,as de" l\ode Schwerd ge he:ilt;Bettler ,,erd@n FUrste:nbrUder,w0 dein :.1nfter Flu1el мeilt.Se:1d u.ischlunsen, '\ill!.onenlOie:.en uB der 1•n:.en lleltБrUd!!r, uber• Sternen:!!lt�а ein l.1eber Vater wohnen,MatchesAi Шt:- Ff-="uoe F1eu е s 11 юt:"r Gotter'un•ёn То ltlc>f ,11.,5, El1�1uГ"' Wlr Ьf>ffE'kf'•.-t.:t-r1rtJrki:-n Hirт11rJis1·he dein Hei1iglhu1" Detne Zaut>c, binC!en ;,ieder \11а.5 .. �, 1 tooes, hлr!IO ai:-11 e11t 6t"t:Jer c1aen Furstent>rltaer �·,о ckJn 5,anne1 Flugel • ell! sг1�1.;r.-sc N1Jo�en 1.11111ontnl 011:'5.i:-r l(ul1 <fer 2arzen \\'en1 Вн.1аеr libPI 1Т' St�rnenze-11 п ur..-e1n !le-ber V.atN otюenCodepreg_match_alt('t p{L�-r 'Ал die Freude Freude schoner Gotterfunken Tochter ausEl1s1um Wlr betreten •euenrunkt>n H1mmrlsc1,e dein He!llgthum Delne Zauber tllnden\'Jteder \vas der Mode Sch\'1erd getheitt 8ettler •:,erden Furstenbruder но dею sa11nerFlugel Ytellt Seld umschlungen Mll!lone:n1 Olesen Kul1 dег ganzen \'Veltl вгur:�ег t1ЬermSternenze111nuB eln lleber Vater �.,.ohnen• preg_match_a11preg_matchpreg_replac еpreg_sp1n., caseless (1)мu11:1llne mode (m)Dot all 1s1Extended (Х)Anchored !А)Dollar ena only (D)Extra ana�sls 01 pattern rS>Pattem ls ungreea; (U)Extra (Х)Pattern ts treated as UTF·8 (о)Pattern orderserorcierO"fse-t taptureSpl,t no emptySplrt delim с aptureSpl1t o�et capture-L!MltHelp РНР PCREРис.
6.4. Выделение букв нижнего регистра с помощью свойстваВ табл. 6.2 приведен список свойств, используемых в соответствии с синтаксисом \р {свойство) или Р {свойство) (см. описание синтаксиса рсrе(З) на сайтеhttp://www. pcre. org/pcre. txt). Кроме того, свойства позволяют учитывать присопоставлении особенности используемого языка оригинала (см. табл. А.8).Таблица 6.2. Свойства символовСвойствоОписаниесДругоеСеУправляющий символCfФорматСпНе присвоеноСоЧастное использованиеCsСуррогатLБукваLIБуква нижнего регистраГnава 6. Соnоставnение с симвоnами Unicode и другими симвоnами81Окончание табл. 6.2СвойствоОписаниеLmБуква-модификаторLoДругая букваLtПрописная букваLuБуква верхнего регистраL&LI, Lu или LtмЗнакМсВнутристрочный знакМеЗаключающий знакМпВнестрочный знакNЦифраNdДесятичное числоNIБуквенная цифраNoДругая цифрарЗнак препинанияРеСоединительный знак препинанияPdТиреРеЗакрывающий знак препинанияPfЗавершающий знак препинанияPiНачальный знак препинанияРоДругой знак препинанияPsОткрывающий знак препинанияsСимволScСимвол валютыSkСимвол-модификаторSmМатематический символSoДругой символzРазделительZIРазделитель строкZpРазделитель абзацевZsРазделительный пробел82Глава 6.
Сопоставление с символами Unicode и другими символамиПоиск соответствий управnяющим симвоnамКакие выражения следует использовать для сопоставления с управляющими символами? Необходимость в поиске управляющих символов возникает не так уж часто, нознание того, как это делается, вам не помешает. В архиве примеров находится файл ascii.txt, состоящий из 128 строк, которые содержат все АSСП-символы, по одному в каждойстроке (отсюда и 128 строк). Поэтому в случае успешного поиска вы обычно будете получать одну строку.
Этот файл отлично подходит для целей тестирования.При поиске строк или управляющих символов в файле ascii.txt с помощью утилиты grep или ack обе они могут интерпретировать этот файл как двоичный.В таком случае при обнаружении совпадения каждая из них может всего лишьвывести сообщение "Biпary file ascii.txt matches" ("Обнаружено совпадениев двоичном файле ascii.txt"), и на этом все закончится.В регулярных выражениях управляющие символы можно указывать в следующемвиде:\схгде х - интересующий вас управляющий символ.Предположим, вы хотите найти в файле пустой символ (NULL).
В Perl это можно сделать с помощью следующей команды:perl -n -е 'print if /\с@/' ascii.txtРезультат должен быть таким:о. NullПоскольку пустой символ - непечатный, вы не сможете увидеть его, но он естьв файле.Если вы откроете файл ascii.txt не в vim, а в каком-то другом редакторе, то он,вероятно, удалит управляющие символы из файла, поэтому я не рекомендуювам этого делать.Для поиска пустого символа можно также использовать еsсаре-последовательность \ О.Проверьте это, выполнив следующую команду:perl -n -е 'print if /\0/' ascii.txtПродолжая в том же духе, найдите символ BEL (звуковой сигнал) с помощью такойкоманды:perl -n -е 'print if /\cG/' ascii.txtЭта команда вернет следующую строку:7.
BellЭтот же результат можно получить, используя аббревиатуру \а:perl -n -е 'print if /\а/' ascii.txtГлава 6. Сопоставление с символами Unicode и другими символами83Для поиска символа ESCAPE (альтернативный регистр №2, АР2) используйте такуюкоманду:perl -n -е 'print if /\с[/' ascii.txtприводящую к следующему результату:27. Escapeили эквивалентную команду, в которой используется аббревиатура \е:perl -n -е 'print if /\е/' ascii.txtА как насчет символа BACKSPACE (возврат на шаг)� Проверьте:perl -n -е 'print if /\сН/' ascii.txtЭта команда выдаст следующий результат:8. BackspaceТо же самое можно получить, используя скобочное выражение:perl -n -е 'print if /[\Ь]/' ascii.txtА как интерпретировалась бы последовательность символов \Ь, не используй мы скобок? Совершенно верно: как граница слова (см.
главу 2).Скобки изменяют способ обработки последовательности процессором. В данном случае благодаря им Perl воспринимает эту последовательность как символ BACKSPACE.В табл. 6.3 сведены все коды, которые мы использовали в этой главе для сопоставления с различными символами.Таблица 6.3. Коды для сопоставления с символами Unicode и другими символамиКодОписание\иххххUnicode (4 позиции)\хххUnicode (2 позиции)\UxxxxxxxxUnicode (8 позиций)\хххВосьмеричный код\схУправляющий символ\0Пустой символ\аЗвуковой сигнал\еEscape[\Ь\]Возврат на шаг (BACKSPACE)На этом данная глава завершается. В следующей главе вы поближе познакомитесьс квантификаторами.84Гnава 6. Сопоставnение с симвоnами Unicode и другими симвоnамиО чем вы узнаnи в rnaвe 6• Как выполнить сопоставление с любым символом Unicode, используя выражения\uxxxx и \ххх.• Как выполнить сопоставление с любым символом Unicode в редакторе vim, используя выражения \ %ххх, \%Ххх, \%uxxxx и \%Uxxxx.• Как выполнить сопоставление с символами, коды которых находятся в пределахдиапазона 0-255, используя восьмеричный формат \000.• Как использовать свойства символов Unicode с помощью последовательности\о{х}.• Как выполнить сопоставление с управляющими символами, используя последовательности \е и \сН.• Дополнительные сведения об использовании Perl в командной строке (дополнительные однострочные команды Perl).На заметку• Для ввода управляющих символов в файл ascii.txt я использовал редактор vim(http://www.vim.org).
В vim для этого надо сначала нажать комбинациюклавиш <Ctrl+V>, а затем комбинацию, соответствующую управляющей последовательности для данного символа, например <Ctrl+C> для символа конца текста (END OF ТЕХТ). Для ввода двухзначных шестнадцатеричных кодов символов я также использовал комбинацию клавиш <Ctrl+V> с последующим вводомх и кода символа. Для ввода управляющих символов можно также использоватьдиrрафы - пары букв, которые воспринимаются системами текстового поиска некак пара отдельных символов, а как единое целое. Чтобы увидеть список возможных кодов, введите в vim команду : digraph. Чтобы ввести диграф, необходимонажать комбинацию клавиш <Ctrl+K> в режиме Insert (Вставка), а затем ввестидвухбуквенное обозначение диграфа (например, NU для ввода пустого символа).• Regex Него (http://regexhero.net/tester) - реализация регулярных выражений в браузере для платформы .NET, написанная Стивом Уортамом.