V.   Пятая группа вопросов: Регулярные выражения



  1. Представление символов.

      Символ \, непосредственно предшествующий одному из метасимволов, отменяет специальное значение последнего. Если же символ \ непосредственно предшествует обычному символу, то, напротив, такая последовательность символов во многих случаях приобретает специальное значение. Подобного рода последовательности будем называть метапоследовательностями, Метапоследовательности в регулярном выражении служат, в основном, для представления отдельных символов, классов символов или определенного места в строке, дополняя и иногда дублируя функции метасимволов. Рассмотрим существующие метапоследовательности.

1.Сокращенные обозначения символов: \n, \t, \e ...

Представление Символ Обозначение Расшифровка
\t Табуляция HT Horizontal tabulation
\v Вертикальная табуляция VT Vertical tabulation
\r Возврат каретки CR Carriage return
\n Перевод строки LF Line feed
\f Конец страницы FF Form feed
\a Звонок BEL Bell character
\e Escape-символ ESC Escape character
\b Забой Должен находиться внутри квадратных скобок (иначе интерпретируется как граница слова). BS Backspace

2.Восьмеричные коды: \код

\nnn — представляет символ, восьмеричный код которого равен nnn. Например, последовательность \120\145\162\154 представляет слово Perl (\120 — восьмеричный код буквы Р, \145 — буквы е, \162 — буквы r, \154 — буквы l).

Восьмеричные коды: \число

Реализации, поддерживающие восьмеричную запись (т. е. запись чи­сел в системе счисления с основанием 8), в общем случае позволяют за­давать байты и символы по их кодам, состоящим из двух или трех цифр. Например, \015\012 соответствует последовательности ASCII-символов CR/LF. Восьмеричные коды позволяют легко вставлять в вы­ражения символы, которые трудно вставить другим способом. Напри­мер, в Perl можно использовать для ASCII-символа Escape обозначение \e, но в awk такая возможность отсутствует. Поскольку в awk поддер­живаются восьмеричные коды, символ Escape можно вставить непо­средственно в виде ASCII-кода: \033.

В некоторых реализациях предусмотрен особый случай - совпадение \0 с нуль-байтом. В других реализациях поддерживаются все восьме­ричные коды, состоящие из одной цифры (как правило, только в том случае, если при этом не поддерживаются обратные ссылки вида \1). При возникновении конфликтов неоднозначная последовательность обычно интерпретируется как обратная ссылка, а не как восьмерич­ный код. Некоторые реализации (как, например, java.util.regex) до­пускают восьмеричные коды из четырех цифр; это сделано для соблю­дения правила, по которому любой восьмеричный код должен начи­наться с 0.

Вероятно, вас интересует, как интерпретируются недопустимые после­довательности вида \565 (8-разрядные восьмеричные коды лежат в ин­тервале от \000 до \377). Похоже, половина реализаций оставляет их в виде значения, выходящего за пределы байта (которое может совпасть с расширенным символом при поддержке Юникода), а другая полови­на урезает их до одного байта. В общем случае рекомендуется ограни­чиваться восьмеричными кодами из интервала до \377.

3. Шестнадцатеричные коды, Юникод: \xкод, \x{код}, \uкод, \Uкод …

\xnn — представляет символ, шестнадцатеричный код которого равен nn. Слово Perl, например, представляется последовательностью \x50\x65\x72\x6C.

По аналогии с восьмеричными кодами во многих программах сущест­вует возможность ввода кодов в шестнадцатеричной системе счисле­ния (с основанием 16) при помощи префиксов \х, \и и \U. Например, по­следовательность \xOD\xOA соответствует последовательности ASCII-символов CR/LF.

Наряду с выбором синтаксиса необходимо учитывать, сколько цифр может содержать код, а также возможно ли его заключение в скобки (или это является обязательным требованием).

 

4. Управляющие символы: \cсимвол

Во многих диалектах поддерживается последовательность символ предназначенная для идентификации управляющих символов с кода­ми, меньшими 32 (некоторые диалекты допускают более широкий ин­тервал). Например, \cH совпадает с символом Control+H, представля­ющим в ASCII клавишу Backspace, a \cJ совпадает с символом перево­да строки ASCII (этот символ часто представляется метасимволом \n, но в зависимости от платформы также используется метасимвол \r).

Системы, поддерживающие эту конструкцию, различаются в техни­ческих деталях. Вы всегда можете с полной уверенностью использо­вать прописные английские буквы, как в приведенных выше приме­рах. В большинстве реализаций также допускается использование строчных английских букв, хотя они, например, не поддерживаются пакетом регулярных выражений для Java от Sun. Точная интерпрета­ция неалфавитных символов практически полностью зависит от диа­лекта, поэтому я рекомендую использовать в конструкции \с только буквы верхнего регистра.

Отмечу, что данная возможность также поддерживается в GNU Emacs, но при этом используется громоздкая метапоследовательность ?\^символ (например, ?~H означает забой).

 

  1. Символьные классы и аналогичные конструкции.

1. Обычные классы: [a-z] и [^a-z].

В современных диалектах предусмотрено несколько способов опреде­ления набора символов, разрешенных в некоторой позиции регуляр­ного выражения, однако простые символьные классы поддерживают­ся всеми программами. тасимволов изменяются в зависимости от того, принадлежат они сим­вольному классу или нет. Например, * никогда не является метасим­волом в символьном классе, a « – » в общем случае интерпретируется как метасимвол. Интерпретация некоторых метапоследовательностей (та­кие как \b) в символьном классе иногда отличается от их интерпрета­ции за пределами класса.

В большинстве систем в общем случае порядок перечисления символов в классе несущественен, а использование интервалов вместо списка не влияет на скорость обработки (т.е. [0-9] ничем не отличается от [9081726354]). Тем не менее некоторые реализации (например, пакет ре­гулярных выражений для Java от Sun) не обеспечивают полной опти­мизации классов, поэтому в общем случае рекомендуется по возмож­ности использовать интервалы, которые обычно работают быстрее.

Символьный класс всегда определяет позитивное условие. Другими словами, чтобы совпадение было успешным, символ в тексте должен совпасть с одним из перечисленных символов. Для инвертированных символьных классов совпавший символ должен быть одним из симво­лов, не входящих в класс. Инвертированный символьный класс удобно рассматривать как «символьный класс с инвертированным списком» (обязательно ознакомьтесь с предупреждением об инвертированных символьных классах и точке в следующем разделе). Раньше конструк­ция вида [~LMNOP] была эквивалентной [\x00-KQ-\xFF]. В восьмираз­рядных системах эта эквивалентность сохраняется и до сих пор, но в таких системах, как Юникод, в которых коды символов превышают 255 (\xFF), инвертированные классы вида [~LMN0P] включают многие тысячи символов кодировки - все, за исключением l_, M, N, O и Р.

При использовании интервалов необходимо хорошо знать кодировку, в которой определяется интервал. Например, интервал [a-Z] с большой вероятностью задан ошибочно и уж заведомо не ограничивается алфа­витными символами. Одним из вариантов задания набора алфавитных символов является конструкция [a-zA-Z] (по крайней мере, для коди­ровки ASCII).

 

2. Почти любой символ: точка

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

· В некоторых системах с поддержкой Юникода (например, в пакете регулярных выражений для Java от Sun) точка в общем случае не совпадает с завершителями строк Юникода.

· Совпадение для точки может изменяться в зависимости от режима поиска (^ 146).

· В стандарте POSIX сказано, что точка не совпадает с нуль-симво­лом (т. е. символом, код которого равен нулю), но большинство сце­нарных языков допускает включение нуль-символов в текст (и точ­ка совпадает с этими символами).


Дата добавления: 2018-04-04; просмотров: 431; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!