V. Пятая группа вопросов: Регулярные выражения
- Представление символов.
Символ \, непосредственно предшествующий одному из метасимволов, отменяет специальное значение последнего. Если же символ \ непосредственно предшествует обычному символу, то, напротив, такая последовательность символов во многих случаях приобретает специальное значение. Подобного рода последовательности будем называть метапоследовательностями, Метапоследовательности в регулярном выражении служат, в основном, для представления отдельных символов, классов символов или определенного места в строке, дополняя и иногда дублируя функции метасимволов. Рассмотрим существующие метапоследовательности.
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. Обычные классы: [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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!