Spec-Zone.ru › Perl 5.32

perlrebackslash

СОДЕРЖАНИЕ

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

ИМЯ

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

ОПИСАНИЕ

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

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

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

Обратная косая черта

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

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

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

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

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

[1]

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

Все последовательности и escapes

Те, которые не могут быть использованы внутри скобочного класса символов (как [\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 [].

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

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

Несколько символов имеют выделенный escape символ. В следующей таблице показаны эти символы, вместе с их кодами ASCII (в десятичном и шестнадцатеричном виде), именем ASCII, управляющим escape на платформах 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), и т.д. Подробности см. в "Операторы цитирования regexp" в 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).

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

Восьмеричные escapes

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

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

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

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

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

В заключение, форма \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.

Мнемоника: 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, варьируется в зависимости от различных пragma и модификаторов регулярных выражений. Можно ограничить сопоставление диапазоном 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.
/(.)(.)\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 соответствует позиции, где закончилось предыдущее совпадение в строке, или началу строки, если не было предыдущего совпадения.

Мнемоника: Глобальный.

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

\b{...}, доступная начиная с версии 5.22, соответствует границе (между двумя символами, или перед первым символом строки, или после последнего символа строки) в соответствии с правилами Юникода для типа границы, указанного в фигурных скобках. Типы границ приведены в нескольких абзацах ниже. \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{...} могут или не могут совпадать в начале и конце строки, в зависимости от типа границы. Они реализуют стандартные границы Юникода, указанные в 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}

Это соответствует границе предложения Юникода. Это средство для разбора предложений естественного языка. Оно дает хорошие, но не идеальные результаты. Например, оно считает, что «г-н Смит» — это два предложения. Более подробные сведения см. в 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 оставляет за собой право обновлять свою реализацию в соответствии с новыми правилами Юникода. В прошлом некоторые изменения были связаны с добавлением новых символов в стандарт, которые имеют другие характеристики, чем все предыдущие символы, поэтому для их обработки были сформулированы новые правила. Это не должно вызывать проблем с обратной совместимостью. Но некоторые изменения повлияли на обработку существующих символов, потому что Технический комитет Юникода решил, что это изменение оправдано по тем или иным причинам. Это может быть для исправления ошибки или потому, что они считают, что с новым правилом достигаются лучшие результаты.

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

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

Примеры
 "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–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.32.0/perlrebackslash

Spec-Zone.ru

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