Spec-Zone.ru › Perl 5.30

perlrebackslash

СОДЕРЖАНИЕ

  • НАЗВАНИЕ
  • ОПИСАНИЕ
    • Обратный слэш
    • Все последовательности и экранирования
    • Экранирование символов
      • Фиксированные символы
        • Пример
      • Управляющие символы
        • Пример
      • Именованные или числовые символы и последовательности символов
        • Пример
      • Восьмеричные экранирования
        • Примеры (предполагая платформу ASCII)
        • Правила разбора между восьмеричными экранированиями старого стиля и обратными ссылками
      • Шестнадцатеричные экранирования
        • Примеры (предполагая платформу ASCII)
    • Модификаторы
      • Примеры
    • Классы символов
      • Классы Unicode
    • Обращения
      • Абсолютные обращения
        • Примеры
      • Относительные обращения
        • Примеры
      • Именованные обращения
        • Примеры
    • Утверждения
      • Примеры
    • Разное
      • Примеры

НАЗВАНИЕ

perlrebackslash - Последовательности обратного слэша и экранирования в Perl-регулярных выражениях

ОПИСАНИЕ

Основная документация по Perl-регулярным выражениям находится в perlre.

В этом документе описываются все последовательности обратного слэша и экранирования. После объяснения роли обратного слэша в нём перечислены все последовательности, имеющие специальное значение в Perl-регулярных выражениях (в алфавитном порядке), а затем описывается каждая из них.

Большинство последовательностей подробно описаны в разных документах; основная цель этого документа — предоставить краткий справочник, описывающий все последовательности обратного слэша и экранирования.

Обратный слэш

В регулярном выражении обратный слэш может выполнить одну из двух задач: либо он убирает специальное значение следующего за ним символа (например, \| соответствует вертикальной черте, это не чередование), либо он является началом последовательности обратного слэша или экранирования.

Правила, определяющие, что это такое, довольно просты: если символ, следующий за обратным слэшем, является символом ASCII-пунктуации (не-слово), то есть любой символ, который не является буквой, цифрой или подчёркиванием, то обратный слэш просто убирает любое специальное значение символа, следующего за ним.

Если символ, следующий за обратным слэшем, является буквой или цифрой ASCII, то последовательность может быть специальной; если это так, она перечислена ниже. Некоторые буквы ещё не использовались, поэтому экранирование их обратным слэшем не изменяет их на специальные. Будущая версия Perl может присвоить им специальное значение, поэтому, если включены предупреждения, Perl выдаёт предупреждение при использовании такой последовательности. [1].

Однако гарантируется, что последовательности обратного слэша или экранирования никогда не имеют символа пунктуации, следующего за обратным слэшем, ни сейчас, ни в будущих версиях Perl 5. Поэтому безопасно ставить обратный слэш перед символом не-слова.

Обратите внимание, что сам обратный слэш является специальным символом; если вы хотите найти обратный слэш, вам нужно экранировать обратный слэш с помощью обратного слэша: /\\/ соответствует одиночному обратному слэшу.

[1]

Есть одно исключение. Если вы используете буквенно-цифровой символ в качестве разделителя своего шаблона (чего вам, вероятно, не следует делать по причинам удобочитаемости), вам нужно экранировать разделитель, если вы хотите его найти. Perl при этом предупреждать не будет. См. также "Подробности синтаксического анализа цитируемых конструкций" в perlop.

Все последовательности и экранирования

Те, которые не могут использоваться внутри скобочной группы символов (например, [\da-z]) помечены как Not in [].

\000              Octal escape sequence.  See also \o{}.
\1                Absolute backreference.  Not in [].
\a                Alarm or bell.
\A                Beginning of string.  Not in [].
\b{}, \b          Boundary. (\b is a backspace in []).
\B{}, \B          Not a boundary.  Not in [].
\cX               Control-X.
\d                Match any digit character.
\D                Match any character that isn't a digit.
\e                Escape character.
\E                Turn off \Q, \L and \U processing.  Not in [].
\f                Form feed.
\F                Foldcase till \E.  Not in [].
\g{}, \g1         Named, absolute or relative backreference.
                  Not in [].
\G                Pos assertion.  Not in [].
\h                Match any horizontal whitespace character.
\H                Match any character that isn't horizontal whitespace.
\k{}, \k<>, \k''  Named backreference.  Not in [].
\K                Keep the stuff left of \K.  Not in [].
\l                Lowercase next character.  Not in [].
\L                Lowercase till \E.  Not in [].
\n                (Logical) newline character.
\N                Match any character but newline.  Not in [].
\N{}              Named or numbered (Unicode) character or sequence.
\o{}              Octal escape sequence.
\p{}, \pP         Match any character with the given Unicode property.
\P{}, \PP         Match any character without the given property.
\Q                Quote (disable) pattern metacharacters till \E.  Not
                  in [].
\r                Return character.
\R                Generic new line.  Not in [].
\s                Match any whitespace character.
\S                Match any character that isn't a whitespace.
\t                Tab character.
\u                Titlecase next character.  Not in [].
\U                Uppercase till \E.  Not in [].
\v                Match any vertical whitespace character.
\V                Match any character that isn't vertical whitespace
\w                Match any word character.
\W                Match any character that isn't a word character.
\x{}, \x00        Hexadecimal escape sequence.
\X                Unicode "extended grapheme cluster".  Not in [].
\z                End of string.  Not in [].
\Z                End of string.  Not in [].

Экранирование символов

Фиксированные символы

Несколько символов имеют выделенное экранирование символов. В следующей таблице показаны эти символы вместе с их кодами ASCII (в десятичной и шестнадцатеричной системах), их именем в ASCII, управляющим экранированием на платформах ASCII и кратким описанием. (Для платформ EBCDIC см. "РАЗЛИЧИЯ В ОПЕРАТОРАХ" в perlebcdic.)

Seq.  Code Point  ASCII   Cntrl   Description.
      Dec    Hex
 \a     7     07    BEL    \cG    alarm or bell
 \b     8     08     BS    \cH    backspace [1]
 \e    27     1B    ESC    \c[    escape character
 \f    12     0C     FF    \cL    form feed
 \n    10     0A     LF    \cJ    line feed [2]
 \r    13     0D     CR    \cM    carriage return
 \t     9     09    TAB    \cI    tab
[1]

\b — символ возврата каретки только внутри класса символов. За пределами класса символов \b — граница между словами/не-словами, а \b{} — какой-то другой тип границы.

[2]

\n соответствует логическому переносу строки. Perl преобразует между \n и родным для вашей операционной системы символом новой строки при чтении из или записи в текстовые файлы.

Пример
$str =~ /\t/;   # Matches if $str contains a (horizontal) tab.

Управляющие символы

\c используется для обозначения управляющего символа; символ, следующий за \c, определяет значение конструкции. Например, значение \cA равно chr(1), а значение \cb равно chr(2), и так далее. Подробные сведения находятся в "Операторы-метасимволы в регулярных выражениях" в perlop. Полный список значений chr(1), и т.д. для платформ ASCII и EBCDIC находится в "РАЗЛИЧИЯ В ОПЕРАТОРАХ" в perlebcdic.

Обратите внимание, что \c\ в конце регулярного выражения (или строки с двойными кавычками) недействительно. Обратный слэш должен следовать за другим символом. То есть, \c\X означает chr(28) . 'X' для всех символов X.

Для создания платформонезависимого кода необходимо использовать \N{NAME} вместо него, например, \N{ESCAPE} или \N{U+001B}, см. charnames.

Мемоническая подсказка: управляющий символ.

Пример
$str =~ /\cK/;  # Matches if $str contains a vertical tab (control-K).

Именованные или числовые символы и последовательности символов

Символы Unicode имеют имя Unicode и числовое значение кода (порядковый номер). Используйте конструкцию \N{} для указания символа с помощью любого из этих значений. Некоторые последовательности символов также имеют имена.

Для указания по имени имя символа или последовательности символов помещается в фигурные скобки.

Для указания символа по коду Unicode используйте форму \N{U+code point}, где код символа — число в шестнадцатеричной системе, указывающее код символа, который Unicode присвоил нужному символу. Обычно, но не обязательно, используются ведущие нули для заполнения числа четырьмя цифрами. Таким образом \N{U+0041} означает LATIN CAPITAL LETTER A, и вы редко увидите его без двух ведущих нулей. \N{U+0041} означает «A», даже на машинах EBCDIC (где порядковое значение «A» не равно 0x41).

Можно даже присвоить свои имена символам и последовательностям символов, используя модуль charnames. Эти пользовательские имена имеют область видимости, связанную с контекстом, поэтому у заданного кода символа могут быть разные имена в разных контекстах. Использованное имя — это то, что действительно присутствует во время расширения \N{}. Для шаблонов в контексте двойных кавычек это означает время разбора шаблона. Но для шаблонов, ограниченных одинарными кавычками, расширение откладывается до времени компиляции шаблона, в котором может использоваться другой charnames переводчик.

(Существует расширенный внутренний вид, который вы можете увидеть в выводе отладки: \N{U+code point.code point...}. ... означает любое количество таких кодов символов, разделённых точками. Это представляет собой последовательность, образованную из символов. Это только внутренняя форма, может быть изменена, и вы не должны пытаться её использовать.)

Мемоническая подсказка: именованный символ.

Обратите внимание, что символ или последовательность символов, выраженные как именованный или числовой символ, считаются символом без специального значения движком регулярных выражений и будут находиться "как есть".

Пример
$str =~ /\N{THAI CHARACTER SO SO}/;  # Matches the Thai SO SO character

use charnames 'Cyrillic';            # Loads Cyrillic names.
$str =~ /\N{ZHE}\N{KA}/;             # Match "ZHE" followed by "KA".

Восьмеричные экранирования

Существуют две формы восьмеричных экранирований. Каждая используется для указания символа по его коду, указанному в восьмеричной записи.

Одна форма, доступная начиная с Perl 5.14, выглядит как \o{...}, где точки представляют собой одну или несколько восьмеричных цифр. Она может использоваться для любого символа Unicode.

Она была введена, чтобы избежать потенциальных проблем с другой формой, доступной во всех Perлах. Эта форма состоит из обратного слэша, за которым следуют три восьмеричные цифры. Одна из проблем с этой формой заключается в том, что она может точно совпадать со старой обратной ссылкой (см. "Правила разбора между восьмеричными экранированиями старого стиля и обратными ссылками" ниже). Вы можете избежать этого, сделав первую из трёх цифр всегда нулём, но это сделает \077 наибольшим кодом, который можно указать.

В некоторых контекстах обратный слэш, за которым следуют две или даже одна восьмеричная цифра, может интерпретироваться как восьмеричное экранирование, иногда с предупреждением, и из-за некоторых ошибок — иногда с неожиданными результатами. Кроме того, если вы создаёте регулярное выражение из небольших фрагментов, соединённых вместе, и используете меньше трёх цифр, начало одного фрагмента может интерпретироваться как добавление цифр к концу фрагмента перед ним. См. "Абсолютные обращения" для более подробного обсуждения и примеров проблемы с фрагментами.

Обратите внимание, что символ, выраженный как восьмеричное экранирование, считается символом без специального значения движком регулярных выражений и будет находиться "как есть".

В качестве итога, форма \o{} всегда безопасна в использовании, а другая форма безопасна для использования с кодовыми точками до \077, когда вы указываете их ровно тремя цифрами.

Мнемоника: 0ктальная или октальная.

Примеры (в предположении ASCII платформы)
$str = "Perl";
$str =~ /\o{120}/;  # Match, "\120" is "P".
$str =~ /\120/;     # Same.
$str =~ /\o{120}+/; # Match, "\120" is "P",
                    # it's repeated at least once.
$str =~ /\120+/;    # Same.
$str =~ /P\053/;    # No match, "\053" is "+" and taken literally.
/\o{23073}/         # Black foreground, white background smiling face.
/\o{4801234567}/    # Raises a warning, and yields chr(4).
Правила разбиения неоднозначностей между старыми восьмеричными экранированиями и обратными ссылками

Восьмеричные экранирования формы \000 вне скобочных символьных классов потенциально конфликтуют со старыми обратными ссылками (см. "Абсолютная ссылка" ниже). Они оба состоят из обратного слэша, за которым следуют цифры. Поэтому Perl должен использовать эвристику, чтобы определить, является ли это обратной ссылкой или восьмеричным экранированием. Perl использует следующие правила для разбиения неоднозначностей:

  1. Если за обратным слэшем следует одна цифра, это обратная ссылка.

  2. Если первая цифра после обратного слэша — 0, это восьмеричное экранирование.

  3. Если число после обратного слэша — N (в десятичной системе), и Perl уже видел N групп захвата, Perl считает это обратной ссылкой. В противном случае он считает это восьмеричным экранированием. Если N имеет более трёх цифр, Perl берёт только первые три для восьмеричного экранирования; остальные соответствуют так, как есть.

    my $pat  = "(" x 999;
       $pat .= "a";
       $pat .= ")" x 999;
    /^($pat)\1000$/;   #  Matches 'aa'; there are 1000 capture groups.
    /^$pat\1000$/;     #  Matches 'a@0'; there are 999 capture groups
                       #  and \1000 is seen as \100 (a '@') and a '0'.

Вы можете всегда принудительно интерпретировать обратную ссылку, используя форму \g{...}. Вы можете всегда принудительно интерпретировать восьмеричное значение, используя форму \o{...} или, для чисел до \077 (= 63 в десятичной системе), используя три цифры, начиная с "0".

Шестнадцатеричные экранирования

Подобно восьмеричным экранированиям, существуют две формы шестнадцатеричных экранирований, но обе начинаются с последовательности \x. За ней следует либо ровно две шестнадцатеричные цифры, образующие число, либо шестнадцатеричное число произвольной длины, заключенное в фигурные скобки. Шестнадцатеричное число является кодовой точкой символа, который вы хотите выразить.

Обратите внимание, что символ, выраженный одним из этих экранирований, считается символом без специального значения движком регулярных выражений и будет сопоставляться «как есть».

Мнемоника: шестнадцатеричное.

Примеры (в предположении ASCII платформы)
$str = "Perl";
$str =~ /\x50/;    # Match, "\x50" is "P".
$str =~ /\x50+/;   # Match, "\x50" is "P", it is repeated at least once
$str =~ /P\x2B/;   # No match, "\x2B" is "+" and taken literally.

/\x{2603}\x{2602}/ # Snowman with an umbrella.
                   # The Unicode character 2603 is a snowman,
                   # the Unicode character 2602 is an umbrella.
/\x{263B}/         # Black smiling face.
/\x{263b}/         # Same, the hex digits A - F are case insensitive.

Модификаторы

Ряд последовательностей обратных слэшей связан с изменением следующего символа или символов. \l преобразует следующий символ в нижний регистр, а \u — в верхний регистр (или, точнее, в заглавные буквы). Они предоставляют функциональность, аналогичную функциям lcfirst и ucfirst.

Для преобразования нескольких символов в верхний или нижний регистр можно использовать \L или \U, которые преобразуют все следующие символы в нижний/верхний регистр до конца шаблона или следующего появления \E, в зависимости от того, что произойдет раньше. Они предоставляют функциональность, аналогичную функциям lc и uc.

\Q используется для цитирования (отключения) метасимволов шаблона до следующего \E или конца шаблона. \Q добавляет обратный слэш к любому символу, который может иметь специальное значение для Perl. В ASCII-диапазоне он цитирует каждый символ, который не является буквой, цифрой или символом подчеркивания. См. "quotemeta" в perlfunc для получения подробностей о том, что цитируется для кодовых точек, не относящихся к ASCII. Использование этого гарантирует, что любой символ между \Q и \E будет сопоставляться буквально, а не интерпретироваться движком регулярных выражений как метасимвол.

\F может использоваться для преобразования всех следующих символов в нижний регистр до следующего \E или конца шаблона. Он предоставляет функциональность, аналогичную функции fc.

Мнемоника: нижний регистр, верхний регистр, преобразование регистра, цитирование метасимволов, конец.

Примеры
$sid     = "sid";
$greg    = "GrEg";
$miranda = "(Miranda)";
$str     =~ /\u$sid/;        # Matches 'Sid'
$str     =~ /\L$greg/;       # Matches 'greg'
$str     =~ /\Q$miranda\E/;  # Matches '(Miranda)', as if the pattern
                             #   had been written as /\(Miranda\)/

Классы символов

Регулярные выражения Perl имеют широкий спектр классов символов. Некоторые из классов символов записываются как последовательности обратных слэшей. Мы кратко обсудим их здесь; полные подробности о классах символов можно найти в perlrecharclass.

\w — это класс символов, который соответствует любому символу слова (буквам, цифрам, Unicode-меткам и знакам соединительной пунктуации (например, символу подчеркивания)). \d — это класс символов, который соответствует любой десятичной цифре, а класс символов \s соответствует любому пробельному символу. В Perl 5.10.0 добавлены классы \h и \v, которые соответствуют горизонтальным и вертикальным пробельным символам.

Точный набор символов, соответствующих \d, \s, и \w, варьируется в зависимости от различных прагм и модификаторов регулярных выражений. Возможно ограничить соответствие диапазоном ASCII, используя модификатор регулярного выражения /a. См. perlrecharclass.

Верхние регистры (\W, \D, \S, \H, и \V) — это классы символов, которые соответствуют, соответственно, любому символу, который не является символом слова, цифрой, пробелом, горизонтальным пробелом или вертикальным пробелом.

Мнемоники: слово, цифра, пробел, горизонтальный, вертикальный.

Классы Unicode

\pP (где P — одиночная буква) и \p{Property} используются для сопоставления символа, который соответствует заданному свойству Unicode; свойства включают такие вещи, как «буква» или «тайский символ». Заглавие последовательности до \PP и \P{Property} делает последовательность соответствующей символу, который не соответствует заданному свойству Unicode. Для получения дополнительных сведений см. "Последовательности обратных слэшей" в perlrecharclass и "Свойства символов Unicode" в perlunicode.

Мнемоника: свойство.

Ссылки

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

Абсолютная ссылка

Или \gN (начиная с Perl 5.10.0), или \N (старый стиль), где N — положительное (без знака) десятичное число любой длины — абсолютная ссылка на группу захвата.

N относится к N-й группе скобок, поэтому \gN относится к тому, что было найдено в этой группе скобок. Таким образом, \g1 относится к первой группе захвата в регулярном выражении.

Форму \gN можно эквивалентно записать как \g{N}, что избегает неоднозначности при построении регулярного выражения путём конкатенации коротких строк. В противном случае, если у вас есть регулярное выражение qr/$a$b/, а $a содержит "\g1", а $b содержит "37", вы получите /\g137/, что, вероятно, не то, что вы имели в виду.

В форме \N, N не должно начинаться с "0", и должно быть не менее N групп захвата, иначе N рассматривается как восьмеричное экранирование (но что-то вроде \18 эквивалентно \0018; то есть восьмеричное экранирование "\001" за которым следует буквальная цифра "8").

Мнемоника: группа.

Примеры
/(\w+) \g1/;    # Finds a duplicated word, (e.g. "cat cat").
/(\w+) \1/;     # Same thing; written old-style.
/(.)(.)\g2\g1/;  # Match a four letter palindrome (e.g. "ABBA").

Относительная ссылка

\g-N (начиная с Perl 5.10.0) используется для относительной адресации. (Он может быть записан как \g{-N.) Он относится к N-й группе перед \g{-N}.

Главное преимущество этой формы заключается в том, что она значительно упрощает создание шаблонов со ссылками, которые могут быть интерполированы в более крупные шаблоны, даже если более крупный шаблон также содержит группы захвата.

Примеры
/(A)        # Group 1
 (          # Group 2
   (B)      # Group 3
   \g{-1}   # Refers to group 3 (B)
   \g{-3}   # Refers to group 1 (A)
 )
/x;         # Matches "ABBA".

my $qr = qr /(.)(.)\g{-2}\g{-1}/;  # Matches 'abab', 'cdcd', etc.
/$qr$qr/                           # Matches 'ababcdcd'.

Ссылка по имени

\g{name} (начиная с Perl 5.10.0) может использоваться для ссылки на именованную группу захвата, полностью исключая необходимость думать о позициях буферов захвата.

Для совместимости с регулярными выражениями .Net, \g{name} также может быть записано как \k{name}, \k<name> или \k'name'.

Для предотвращения неоднозначности, имя не должно начинаться с цифры и не должно содержать дефис.

Примеры
/(?<word>\w+) \g{word}/ # Finds duplicated word, (e.g. "cat cat")
/(?<word>\w+) \k{word}/ # Same.
/(?<word>\w+) \k<word>/ # Same.
/(?<letter1>.)(?<letter2>.)\g{letter2}\g{letter1}/
                        # Match a four letter palindrome (e.g. "ABBA")

Утверждения

Утверждения — это условия, которые должны быть истинными; они фактически не соответствуют частям подстроки. Существует шесть утверждений, которые записываются как последовательности обратных слэшей.

\A

\A соответствует только в начале строки. Если модификатор /m не используется, то /\A/ эквивалентно /^/. Однако, если используется модификатор /m, то /^/ соответствует внутренним символам новой строки, но значение /\A/ не изменяется модификатором /m. \A соответствует началу строки независимо от использования модификатора /m.

\z, \Z

\z и \Z соответствуют концу строки. Если модификатор /m не используется, то /\Z/ эквивалентно /$/; то есть, оно соответствует концу строки или символу перед символом новой строки в конце строки. Если используется модификатор /m, то /$/ соответствует внутренним символам новой строки, но значение /\Z/ не изменяется модификатором /m. \Z соответствует концу строки (или непосредственно перед символом новой строки в конце) независимо от использования модификатора /m.

\z аналогично \Z, за исключением того, что оно не соответствует символу перед символом новой строки в конце. \z соответствует только концу строки, независимо от используемых модификаторов, и не только перед символом новой строки. Это позволяет привязать соответствие к истинному концу строки при любых условиях.

\G

\G обычно используется только в сочетании с модификатором /g. Если используется модификатор /g, и соответствие выполняется в скалярном контексте, Perl запоминает, где в исходной строке закончилось последнее соответствие, и в следующий раз начнет соответствие с позиции, где оно закончилось в предыдущий раз.

\G соответствует позиции, где закончилось предыдущее соответствие по этой строке, или началу строки, если предыдущего соответствия не было.

Мнемоника: Global.

\b{}, \b, \B{}, \B

\b{...}, доступная начиная с версии 5.22, соответствует границе (между двумя символами, или перед первым символом строки, или после последнего символа строки) в соответствии с правилами Unicode для типа границы, указанной внутри фигурных скобок. Типы границ приведены в нескольких параграфах ниже. \B{...} соответствует любому месту между символами, где \b{...} того же типа не соответствует.

\b при отсутствии "{" соответствует любому месту между словом (что-то, соответствующее \w) и небуквенным символом (\W); \B при отсутствии "{" соответствует любому месту между символами, где \b не соответствует. Для лучшего соответствия слов в тексте естественного языка см. "\b{wb}" ниже.

\b и \B предполагают, что перед началом и после конца исходной строки находится небуквенный символ; поэтому \b будет соответствовать началу (или концу) исходной строки, если исходная строка начинается (или заканчивается) буквенным символом. В противном случае \B будет соответствовать.

Не используйте что-то вроде \b=head\d\b и ожидайте, что оно будет соответствовать началу строки. Это невозможно, потому что для существования границы перед небуквенным символом "=" должен быть буквенный символ непосредственно перед ним. Все определения границ \b и \B ищут только буквенные символы, а не небуквенные символы и не концы строки. Это может помочь понять, как работают \b и \B, приравняв их следующим образом:

\b  really means    (?:(?<=\w)(?!\w)|(?<!\w)(?=\w))
\B  really means    (?:(?<=\w)(?=\w)|(?<!\w)(?!\w))

В отличие от этого, \b{...} и \B{...} могут или не могут соответствовать началу и концу строки, в зависимости от типа границы. Они реализуют стандартные границы Unicode, указанные в http://www.unicode.org/reports/tr14/ и http://www.unicode.org/reports/tr29/. Типы границ:

\b{gcb} или \b{g}

Это соответствует границе кластера графем Unicode. (На самом деле Perl всегда использует улучшенный «расширенный» кластер графем). Они объяснены ниже в разделе "\X". Фактически, \X — это другой способ получить ту же функциональность. Оно эквивалентно /.+?\b{gcb}/. Используйте тот, который удобнее для вашей ситуации.

\b{lb}

Это соответствует алгоритму разбиения строк по умолчанию Unicode (http://www.unicode.org/reports/tr14/), как он настроен в этом документе (Пример 7 пересмотра 35) для лучшей обработки числовых выражений.

Это подходит для многих целей, но на CPAN доступен модуль Unicode::LineBreak, который предоставляет множество дополнительных функций, включая настройку.

\b{sb}

Это соответствует границе предложения Unicode. Это средство для анализа предложений естественного языка. Оно дает хорошие, но неточные результаты. Например, оно считает, что «Mr. Smith» — это два предложения. Более подробная информация находится по адресу http://www.unicode.org/reports/tr29/. Обратите также внимание, что оно считает, что все, что соответствует "\R" (за исключением символов формы подачи и вертикальной вкладки), является границей предложения. \b{sb} работает с текстом, предназначенным для текстовых процессоров, которые автоматически переносят строки для отображения, но жестко заданные границы строк считаются по существу концами блоков текста (абзацев), а следовательно, и концами предложений. \b{sb} плохо справляется с текстом, содержащим встроенные символы новой строки, например, исходным текстом документа, который вы читаете. Такой текст необходимо предварительно обработать, чтобы избавиться от разделителей строк, прежде чем искать границы предложений. Некоторые люди рассматривают это как ошибку в стандарте Unicode, и это поведение может измениться в будущих версиях Perl.

\b{wb}

Это соответствует границе слова Unicode, но с учетом ожиданий Perl. Это дает лучшие (хотя и не идеальные) результаты для обработки естественного языка, чем обычное \b (без фигурных скобок). Например, он понимает, что апострофы могут быть посередине слов, а скобки — нет (см. примеры ниже). Более подробная информация находится по адресу http://www.unicode.org/reports/tr29/.

Текущее определение границы слова Unicode соответствует каждому символу пробела. Perl адаптирует это, начиная с версии 5.24, чтобы в целом не разделять пробелы, как и обычное \b всегда работало. Это позволяет \b{wb} быть прямым заменителем \b, но с в целом лучшими результатами при обработке естественного языка. (Исключение из этого — когда пробел непосредственно следует за чем-то вроде U+0303, COMBINING TILDE. Если заключительный символ пробела в пробеле является горизонтальным пробелом, он разрывается, чтобы присоединиться вместо него к комбинируемому символу. Точнее, если пробел, заканчивающийся горизонтальным пробелом, имеет символ, следующий за ним, с любыми значениями свойства «Граница слова» «Расширение», «Формат» или «ZWJ», граница между заключительным горизонтальным символом пробела и остальной частью пробела соответствует \b{wb}. Во всех остальных случаях граница между двумя символами пробела соответствует \B{wb}.)

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

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

Мнемоника: boundary.

Примеры
 "cat"   =~ /\Acat/;     # Match.
 "cat"   =~ /cat\Z/;     # Match.
 "cat\n" =~ /cat\Z/;     # Match.
 "cat\n" =~ /cat\z/;     # No match.

 "cat"   =~ /\bcat\b/;   # Matches.
 "cats"  =~ /\bcat\b/;   # No match.
 "cat"   =~ /\bcat\B/;   # No match.
 "cats"  =~ /\bcat\B/;   # Match.

 while ("cat dog" =~ /(\w+)/g) {
     print $1;           # Prints 'catdog'
 }
 while ("cat dog" =~ /\G(\w+)/g) {
     print $1;           # Prints 'cat'
 }

 my $s = "He said, \"Is pi 3.14? (I'm not sure).\"";
 print join("|", $s =~ m/ ( .+? \b     ) /xg), "\n";
 print join("|", $s =~ m/ ( .+? \b{wb} ) /xg), "\n";
prints
 He| |said|, "|Is| |pi| |3|.|14|? (|I|'|m| |not| |sure
 He| |said|,| |"|Is| |pi| |3.14|?| |(|I'm| |not| |sure|)|.|"

Разное

Здесь мы документируем последовательности обратной косой черты, которые не попадают ни в одну из вышеперечисленных категорий. Это:

\K

Это появилось в perl 5.10.0. Всё, что соответствует слева от \K не включается в $&, и не будет заменено, если шаблон используется в замене. Это позволяет вам написать s/PAT1 \K PAT2/REPL/x вместо s/(PAT1) PAT2/${1}REPL/x или s/(?<=PAT1) PAT2/REPL/x.

Мнемоника: Kрасить.

\N

Эта функция, доступная начиная с версии 5.12, соответствует любому символу, который не является новой строкой. Это сокращение для записи [^\n], и идентично метасимволу ., за исключением флага /s, который изменяет значение ., но не \N.

Обратите внимание, что \N{...} может означать имя или номер символа.

Мнемоника: Дополнение к \n.

\R

\R соответствует обобщённой новой строке; то есть, всему, что считается последовательностью разрыва строки в Unicode. Это включает все символы, соответствующие \v (вертикальное пробельное пространство), и многосимвольную последовательность "\x0D\x0A" (возврат каретки, за которым следует перевод строки, иногда называемый сетевой новой строкой; это последовательность конца строки, используемая в текстовых файлах Microsoft, открытых в двоичном режиме). \R эквивалентно (?>\x0D\x0A|\v). (Причина, по которой он не выполняет обратную подстановку, заключается в том, что последовательность считается неразрывной. Это означает, что

"\x0D\x0A" =~ /^\R\x0A$/   # No match

не выполняется, потому что \R соответствует всей строке и не будет выполнять обратную подстановку, чтобы соответствовать только "\x0D".) Поскольку \R может соответствовать последовательности более чем из одного символа, его нельзя помещать внутрь символьного класса в квадратных скобках; /[\R]/ является ошибкой; используйте \v вместо этого. \R была введена в perl 5.10.0.

Обратите внимание, что это не учитывает локаль, которая может быть активна; он соответствует на основе собственного набора символов платформы.

Мнемоника: нет, действительно. \R была выбрана, потому что PCRE уже использует \R, и что ещё более важно, потому что Unicode рекомендует такой метасимвол регулярного выражения и предлагает \R в качестве своей нотации.

\X

Это соответствует кластеру Unicode расширенного графического символа.

\X достаточно хорошо соответствует тому, что обычное (не-Unicode-программистское) использование посчитало бы одним символом. Например, рассмотрите G с каким-либо диакритическим знаком, таким как стрелка. В Unicode нет такого отдельного символа, но его можно составить, используя G, за которым следует Unicode "COMBINING UPWARDS ARROW BELOW", и программное обеспечение, поддерживающее Unicode, отобразит его так, как будто это один символ.

Совпадение является жадным и необратимым, поэтому кластер никогда не разбивается на более мелкие компоненты.

См. также \b{gcb}.

Мнемоника: X расширенный символ Unicode.

Примеры
$str =~ s/foo\Kbar/baz/g; # Change any 'bar' following a 'foo' to 'baz'
$str =~ s/(.)\K\g1//g;    # Delete duplicated characters.

"\n"   =~ /^\R$/;         # Match, \n   is a generic newline.
"\r"   =~ /^\R$/;         # Match, \r   is a generic newline.
"\r\n" =~ /^\R$/;         # Match, \r\n is a generic newline.

"P\x{307}" =~ /^\X$/     # \X matches a P with a dot above.

© 1993–2020 Larry Wall and others
Licensed under the GNU General Public License version 1 or later, or the Artistic License.
The Perl logo is a trademark of the Perl Foundation.
https://perldoc.perl.org/5.30.3/perlrebackslash

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API