Spec-Zone.ru › Perl 5.28

perlrebackslash

СОДЕРЖАНИЕ

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

ИМЯ

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

ОПИСАНИЕ

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

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

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

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

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

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

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

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

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

[1]

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

Все последовательности и эскейпы

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

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

Эскейпы символов

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

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

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

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

[2]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Мнемоника: восьмеричный.

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

Мемоническое правило: 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{...} могут или не могут соответствовать началу и концу строки, в зависимости от типа границы. Они реализуют стандартные границы Юникода, указанные в http://www.unicode.org/reports/tr14/ и http://www.unicode.org/reports/tr29/. Типы границ:

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

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

\b{lb}

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

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

\b{sb}

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

\b{wb}

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

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

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

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

Мемоническое правило: b граница.

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

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

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

Spec-Zone.ru

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