Spec-Zone.ru › Perl 5.34

perlrebackslash

СОДЕРЖАНИЕ

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

ИМЯ

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

ОПИСАНИЕ

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

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

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

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

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

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

Если символ, следующий за обратным слэшем, является буквой 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 для нужного символа. Принято, но необязательно использовать ведущие нули для дополнения числа до 4 цифр. Таким образом, \N{U+0041} означает LATIN CAPITAL LETTER A, и вы редко увидите его без двух ведущих нулей. \N{U+0041} означает "A" даже на машинах EBCDIC (где порядковое значение "A" не равно 0x41).

Пробелы могут быть свободно вставлены рядом с, но внутри фигурных скобок, содержащих имя или код символа. Таким образом, \N{ U+0041 } совершенно законно.

Даже можно давать свои имена символам и последовательностям символов, используя модуль 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.

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

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

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

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

Мнемоника: 0смеричный или oсмеричный.

Примеры (при условии платформы 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).
/\o{ 400}/          # LATIN CAPITAL LETTER A WITH MACRON
/\o{ 400 }/         # Same. These show blanks are allowed adjacent to
                    # the braces
Правила разбора неоднозначностей между восьмеричными escapes старого стиля и обратными ссылками

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

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

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

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

    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{...}. Вы можете всегда принудительно интерпретировать восьмеричный escape, используя форму \o{...}, или для чисел до \077 (= 63 в десятичной системе), используя три цифры, начинающиеся с «0».

Шестнадцатеричные escapes

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

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

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

Примеры (при условии платформы 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.
/\x{ 263b }/       # Same, showing optional blanks adjacent to the
                   # braces

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

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

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

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

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

Мнемоника: Lowercase, Uppercase, Fold-case, Quotemeta, End.

Примеры
$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, зависит от различных pragmas и модификаторов регулярных выражений. Можно ограничить соответствие диапазоном ASCII, используя модификатор регулярного выражения /a. См. perlrecharclass.

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

Мнемоники: word, digit, space, horizontal, vertical.

Классы Unicode

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

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

Ссылка

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

Абсолютное ссылочное обращение

Либо \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 интерпретируется как восьмеричный escape (но что-то вроде \18 равно \0018; то есть восьмеричный escape "\001" за которым следует литерная цифра "8").

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

Примеры
/(\w+) \g1/;    # Finds a duplicated word, (e.g. "cat cat").
/(\w+) \1/;     # Same thing; written old-style.
/(\w+) \g{1}/;  # Same, using the safer braced notation
/(\w+) \g{ 1 }/;# Same, showing optional blanks adjacent to the braces
/(.)(.)\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)
   \g{ -3 } # Same, showing optional blanks adjacent to the braces
 )
/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'.

Для избежания неоднозначностей, name не должно начинаться с цифры и не должно содержать дефис.

Примеры
/(?<word>\w+) \g{word}/   # Finds duplicated word, (e.g. "cat cat")
/(?<word>\w+) \k{word}/   # Same.
/(?<word>\w+) \g{ word }/ # Same, showing optional blanks adjacent to
                          # the braces
/(?<word>\w+) \k{ word }/ # Same.
/(?<word>\w+) \k<word>/   # Same.  There are no braces, so no blanks
                          # are permitted
/(?<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, соответствует границе (между двумя символами, или перед первым символом строки, или после последнего символа строки) в соответствии с правилами Юникода для типа границы, указанного в фигурных скобках. Типы границ перечислены в нескольких абзацах ниже. \B{...} соответствует любому месту между символами, где \b{...} того же типа не соответствует.

\b когда не следует сразу за "{" доступно во всех версиях Perl. Оно соответствует любому месту между словом (чем-то, что соответствует \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{...} могут или не могут соответствовать началу и концу строки, в зависимости от типа границы. Они реализуют стандартные границы Юникода, указанные в https://www.unicode.org/reports/tr14/ и https://www.unicode.org/reports/tr29/. Типы границ:

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

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

\b{lb}

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

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

\b{sb}

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

\b{wb}

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

Текущее определение границы слова в Юникоде соответствует каждой пробельной клавише. Perl адаптирует это, начиная с версии 5.24, чтобы, как правило, не разделять пробелы, точно так же, как всегда работало простое \b. Это позволяет \b{wb} быть прямым заменителем \b, но с, как правило, лучшими результатами для обработки естественного языка. (Исключение из этого правила — когда за пробелом следует что-то вроде U+0303, КОМБИНИРУЮЩАЯ ТИЛЬДА. Если последний пробельный символ в пробеле является горизонтальным пробелом, он выводится наружу, чтобы прикрепиться к комбинирующему символу. Точнее, если пробел, заканчивающийся горизонтальным пробелом, имеет символ, следующий непосредственно за ним, имеющий какое-либо из свойств границы слова "Расширение", "Формат" или "ZWJ", граница между последним горизонтальным пробелом и остальной частью пробела соответствует \b{wb}. Во всех остальных случаях граница между двумя пробелами соответствует \B{wb}.)

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

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

Мнемоника: 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 "СОЧЕТАЕМЫЙ ВВЕРХ СТРЕЛКА НИЖЕ", и программное обеспечение, понимающее Unicode, отобразит его, как будто это один символ.

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

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

Мнемоника: расширенный символ 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–2021 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.34.0/perlrebackslash

Spec-Zone.ru

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