Spec-Zone.ru › Perl 5.38

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.

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

Пример
$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...}. ... означает любое количество таких код точки, разделенных точками. Это представляет последовательность, образованную символами. Это только внутренняя форма, подлежащая изменению, и вам не следует пытаться использовать ее самостоятельно.)

Мнемоника: Nименованный символ.

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

Пример
$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".

Восьмеричные эскейпы

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

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

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

Восьмеричные эскейпы формы \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.
/\x{ 263b }/       # Same, showing optional blanks adjacent to the
                   # braces

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

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

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

\Q используется для цитирования (отключения) метасимволов шаблона до следующего \E или конца шаблона. \Q добавляет обратную косую черту к любому символу, который может иметь специальное значение для Perl. В диапазоне ASCII она цитирует каждый символ, который не является буквой, цифрой или подчеркиванием. См. "quotemeta" в perlfunc для получения подробной информации о том, что цитируется для кодовых точек, отличных от ASCII. Использование этого гарантирует, что любой символ между \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, зависит от различных прагм и модификаторов регулярных выражений. Можно ограничить соответствие диапазоном 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 рассматривается как восьмеричный эскейп (но что-то вроде \18 — то же самое, что \0018; то есть, восьмеричный эскейп "\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.

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

\N

Эта функция, доступная начиная с v5.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}.

Мнемоника: 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–2023 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.38.0/perlrebackslash

Spec-Zone.ru

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