perlrebackslash
СОДЕРЖАНИЕ
- ИМЯ
- ОПИСАНИЕ
- Обратный слеш
- Все последовательности и экранирования
- Экранирование символов
- Модификаторы
- Классы символов
- Ссылки
- Утверждения
- Разное
ИМЯ
perlrebackslash - Последовательности и экранирования обратного слэша в регулярных выражениях Perl
ОПИСАНИЕ
Основная документация по регулярным выражениям Perl находится в perlre.
Этот документ описывает все последовательности обратного слэша и экранирования. После объяснения роли обратного слэша он перечисляет все последовательности, имеющие специальное значение в регулярных выражениях Perl (в алфавитном порядке), а затем описывает каждую из них.
Большинство последовательностей подробно описаны в разных документах; основная цель этого документа — предоставление справочного руководства по всем последовательностям обратного слэша и экранирования.
Обратный слеш
В регулярном выражении обратный слеш может выполнять одну из двух задач: либо он снимает специальное значение символа, следующего за ним (например, \| соответствует вертикальной черте, это не чередование), либо он является началом последовательности обратного слэша или экранирования.
Правила, определяющие, что это такое, довольно просты: если символ, следующий за обратным слэшем, является символом ASCII пунктуации (не являющимся словом) (то есть, любой символ, который не является буквой, цифрой или подчеркиванием), то обратный слеш просто снимает любое специальное значение символа, следующего за ним.
Если символ, следующий за обратным слэшем, является буквой или цифрой ASCII, то последовательность может быть специальной; если это так, она указана ниже. Некоторые буквы еще не использовались, поэтому экранирование их обратным слэшем не меняет их на специальные. Будущая версия Perl может назначить им специальное значение, поэтому, если включены предупреждения, Perl выдает предупреждение, если вы используете такую последовательность. [1].
Однако гарантируется, что последовательности обратного слэша или экранирования никогда не содержат символ пунктуации после обратного слэша, ни сейчас, ни в будущих версиях Perl 5. Поэтому безопасно ставить обратный слеш перед символом, не являющимся словом.
Обратите внимание, что сам обратный слеш является специальным; если вы хотите сопоставить обратный слеш, вы должны экранировать обратный слеш обратным слэшем: /\\/ соответствует одному обратному слэшу.
- [1]
-
Существует одно исключение. Если вы используете буквенно-цифровой символ в качестве разделителя вашего шаблона (чего вам, вероятно, не следует делать по соображениям читаемости), вы должны экранировать разделитель, если хотите сопоставить его. Perl тогда не будет выводить предупреждение. См. также "Подробности парсинга цитируемых конструкций" в perlop.
Все последовательности и экранирования
Те, которые недоступны внутри скобочного класса символов (например, [\da-z]) помечены как Not in [].
\000 Octal escape sequence. See also \o{}.
\1 Absolute backreference. Not in [].
\a Alarm or bell.
\A Beginning of string. Not in [].
\b{}, \b Boundary. (\b is a backspace in []).
\B{}, \B Not a boundary. Not in [].
\cX Control-X.
\d Match any digit character.
\D Match any character that isn't a digit.
\e Escape character.
\E Turn off \Q, \L and \U processing. Not in [].
\f Form feed.
\F Foldcase till \E. Not in [].
\g{}, \g1 Named, absolute or relative backreference.
Not in [].
\G Pos assertion. Not in [].
\h Match any horizontal whitespace character.
\H Match any character that isn't horizontal whitespace.
\k{}, \k<>, \k'' Named backreference. Not in [].
\K Keep the stuff left of \K. Not in [].
\l Lowercase next character. Not in [].
\L Lowercase till \E. Not in [].
\n (Logical) newline character.
\N Match any character but newline. Not in [].
\N{} Named or numbered (Unicode) character or sequence.
\o{} Octal escape sequence.
\p{}, \pP Match any character with the given Unicode property.
\P{}, \PP Match any character without the given property.
\Q Quote (disable) pattern metacharacters till \E. Not
in [].
\r Return character.
\R Generic new line. Not in [].
\s Match any whitespace character.
\S Match any character that isn't a whitespace.
\t Tab character.
\u Titlecase next character. Not in [].
\U Uppercase till \E. Not in [].
\v Match any vertical whitespace character.
\V Match any character that isn't vertical whitespace
\w Match any word character.
\W Match any character that isn't a word character.
\x{}, \x00 Hexadecimal escape sequence.
\X Unicode "extended grapheme cluster". Not in [].
\z End of string. Not in [].
\Z End of string. Not in []. Экранирование символов
Фиксированные символы
Несколько символов имеют выделенное экранирование символа. В следующей таблице показаны эти символы, а также их кодовые точки ASCII (в десятичном и шестнадцатеричном формате), их название в ASCII, управляющее экранирование на платформах ASCII и краткое описание. (Для платформ EBCDIC см. "РАЗЛИЧИЯ ОПЕРАТОРОВ" в perlebcdic.)
Seq. Code Point ASCII Cntrl Description.
Dec Hex
\a 7 07 BEL \cG alarm or bell
\b 8 08 BS \cH backspace [1]
\e 27 1B ESC \c[ escape character
\f 12 0C FF \cL form feed
\n 10 0A LF \cJ line feed [2]
\r 13 0D CR \cM carriage return
\t 9 09 TAB \cI tab - [1]
-
\b— это символ вставки, только внутри класса символов. Вне класса символов\b— это граница слова/не-слова, а\b{}— это другой тип границы. - [2]
-
\nсоответствует логическому переводу строки. Perl преобразует между\nи символом новой строки вашей операционной системы при чтении из или записи в текстовые файлы.
Пример
$str =~ /\t/; # Matches if $str contains a (horizontal) tab. Управляющие символы
\c используется для обозначения управляющего символа; символ, следующий за \c, определяет значение конструкции. Например, значение \cA равно chr(1), а значение \cb равно chr(2) и т. д. Подробности см. в "Операторы цитирования регулярных выражений" в perlop. Полный список того, что chr(1), и т.д. означает для платформ ASCII и EBCDIC, представлен в "РАЗЛИЧИЯ ОПЕРАТОРОВ" в perlebcdic.
Обратите внимание, что \c\ в конце регулярного выражения (или двойной кавычке) не является допустимым. За обратным слэшем должен следовать другой символ. То есть \c\X означает chr(28) . 'X' для всех символов X.
Для создания платформонезависимого кода необходимо использовать \N{NAME}, например \N{ESCAPE} или \N{U+001B}, см. charnames.
Мемоническое обозначение: управляющий символ.
Пример
$str =~ /\cK/; # Matches if $str contains a vertical tab (control-K). Именованные или пронумерованные символы и последовательности символов
Символы Unicode имеют имя Unicode и числовое значение кодовой точки (порядковый номер). Используйте конструкцию \N{} для указания символа по одному из этих значений. Некоторые последовательности символов также имеют имена.
Для указания по имени имя символа или последовательности символов находится между фигурными скобками.
Для указания символа по кодовой точке Unicode используйте форму \N{U+code point}, где кодовая точка — число в шестнадцатеричном формате, которое задает кодовую точку, назначенную Unicode для нужного символа. Обычно, но не обязательно, используются ведущие нули для дополнения числа до 4 цифр. Таким образом, \N{U+0041} означает LATIN CAPITAL LETTER A, и вы редко увидите его без двух ведущих нулей. \N{U+0041} означает "A", даже на машинах EBCDIC (где порядковое значение "A" не равно 0x41).
Пробелы могут быть вставлены рядом с, но внутри фигурных скобок, содержащих имя или кодовую точку. Таким образом, \N{ U+0041 } является совершенно законным.
Можно даже присваивать собственные имена символам и последовательностям символов, используя модуль charnames. Эти пользовательские имена имеют локальную область видимости, поэтому одной кодовой точке могут соответствовать разные имена в разных областях видимости. Используемое имя — это то, что действует в момент расширения \N{}. Для шаблонов в контексте двойных кавычек это означает момент анализа шаблона. Но для шаблонов, которые ограничены одинарными кавычками, расширение откладывается до времени компиляции шаблона, что может очень хорошо иметь другой charnames переводчик.
(Существует расширенная внутренняя форма, которую вы можете увидеть в выходных данных отладки: \N{U+code point.code point...}. ... означает любое количество таких кодовых точек, разделенных точками. Это представляет собой последовательность, образованную символами. Это только внутренняя форма, которая может быть изменена, и вы не должны пытаться использовать её самостоятельно.)
Мемоническое обозначение: Именованный символ.
Обратите внимание, что символ или последовательность символов, выраженные как именованный или пронумерованный символ, рассматриваются движком регулярных выражений как символ без специального значения и будут сопоставлены "как есть".
Пример
$str =~ /\N{THAI CHARACTER SO SO}/; # Matches the Thai SO SO character
use charnames 'Cyrillic'; # Loads Cyrillic names.
$str =~ /\N{ZHE}\N{KA}/; # Match "ZHE" followed by "KA". Восьмеричные экранирования
Существуют две формы восьмеричных экранирований. Каждая используется для указания символа по его кодовой точке в восьмеричной системе счисления.
Одна форма, доступная начиная с Perl 5.14, имеет вид \o{...}, где точки представляют одну или несколько восьмеричных цифр. Она может быть использована для любого символа Unicode.
Она была введена для устранения потенциальных проблем с другой формой, доступной во всех Perl. Эта форма состоит из обратного слэша, за которым следуют три восьмеричные цифры. Одна из проблем с этой формой заключается в том, что она может выглядеть точно так же, как ссылка на обратную ссылку старого стиля (см. "Правила разбора между восьмеричными экранированиями старого стиля и обратными ссылками" ниже). Вы можете избежать этого, сделав первую из трёх цифр всегда нулём, но это делает \077 максимальной задаваемой кодовой точкой.
В некоторых контекстах обратный слеш, за которым следуют две или даже одна восьмеричная цифра, может интерпретироваться как восьмеричное экранирование, иногда с предупреждением, а из-за некоторых ошибок — с неожиданными результатами. Кроме того, если вы создаёте регулярное выражение из соединённых вместе фрагментов, и вы используете меньше трёх цифр, начало одного фрагмента может быть интерпретировано как добавление цифр к концу фрагмента перед ним. См. "Абсолютные ссылки" для более подробного обсуждения и примеров проблемы с фрагментами.
Обратите внимание, что символ, выраженный как восьмеричное экранирование, рассматривается движком регулярных выражений как символ без специального значения и будет сопоставлен "как есть".
В качестве резюме, форма \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 использует следующие правила для разбора:
-
Если за обратной косой чертой следует одна цифра, это обратная ссылка.
-
Если первая цифра после обратной косой черты равна 0, это восьмеричное экранирование.
-
Если число после обратной косой черты равно 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) для лучшей обработки числовых выражений.
Это подходит для многих целей, но на CPAN доступен модуль Unicode::LineBreak, предоставляющий множество дополнительных функций, включая настройку.
-
\b{sb} -
Это соответствует границе предложения Юникода. Это вспомогательное средство для разбора предложений естественного языка. Оно дает хорошие, но не идеальные результаты. Например, оно считает, что «Mr. Smith» — это два предложения. Более подробная информация по адресу https://www.unicode.org/reports/tr29/. Обратите также внимание, что оно считает, что все, соответствующее "\R" (кроме разделителя формы и вертикальной табуляции), является границей предложения.
\b{sb}работает с текстом, предназначенным для текстовых редакторов, которые автоматически обрезают строки для отображения, но жёстко заданные границы строк рассматриваются как конец блоков текста (абзацев), а следовательно, и конец предложений.\b{sb}плохо справляется с текстом, содержащим вложенные разделители строк, например, исходным текстом документа, который вы читаете. Такой текст необходимо предварительно обработать, чтобы удалить разделители строк, прежде чем искать границы предложений. Некоторые люди считают это ошибкой в стандарте Юникода, и такое поведение может значительно измениться в будущих версиях Perl. -
\b{wb} -
Это соответствует границе слова Юникода, но адаптировано под ожидания Perl. Это дает лучшие (хотя и не идеальные) результаты для обработки естественного языка, чем обычное
\b(без фигурных скобок). Например, оно понимает, что апострофы могут стоять в середине слов, а скобки — нет (см. примеры ниже). Более подробная информация по адресу https://www.unicode.org/reports/tr29/.Текущее определение границы слова Юникода соответствует между каждым символом пробела. Perl адаптирует это, начиная с версии 5.24, чтобы в целом не разбивать пробельные интервалы, как это всегда делало обычное
\b. Это позволяет\b{wb}быть прямым заменителем\b, но с в целом лучшими результатами для обработки естественного языка. (Исключение из этой адаптации — когда за пробельным интервалом следует что-то вроде U+0303, КОМБИНИРУЮЩАЯ ТИЛЬДА. Если последний пробельный символ в интервале — горизонтальный пробел, он выделяется, чтобы прикрепиться к объединяющему символу. Точнее, если пробельный интервал, который заканчивается горизонтальным пробелом, имеет символ, следующий за ним, с любым значением свойства границы слова «Расширение», «Формат» или «ZWJ», граница между последним горизонтальным пробельным символом и остальной частью интервала соответствует\b{wb}. Во всех остальных случаях граница между двумя пробельными символами соответствует\B{wb}.)
Важно понимать, что при использовании этих границ Юникода вы рискуете, что будущая версия Perl, содержащая более позднюю версию стандарта Юникода, не будет работать точно так же, как при написании вашего кода. Эти правила не считаются стабильными и более подвержены изменениям, чем остальные части стандарта. Юникод оставляет за собой право изменять их по своему усмотрению, а Perl оставляет за собой право обновлять свою реализацию до новых правил Юникода. В прошлом некоторые изменения были связаны с добавлением новых символов в стандарт, которые имели другие характеристики, чем все предыдущие символы, поэтому были сформулированы новые правила для их обработки. Это не должно создавать проблем с обратной совместимостью. Но некоторые изменения повлияли на обработку существующих символов, поскольку технический комитет Юникода решил, что изменения оправданы по той или иной причине. Это может быть связано с исправлением ошибки или потому, что они считают, что новые правила обеспечивают лучшие результаты.
Также важно понимать, что это стандартные определения границ, и реализации могут захотеть адаптировать результаты для определенных целей и локалей. Например, некоторые языки, такие как японский и тайский, требуют поиска в словаре для точного определения границ слов.
Мемоническая подсказка: boundary.
-
Примеры
"cat" =~ /\Acat/; # Match.
"cat" =~ /cat\Z/; # Match.
"cat\n" =~ /cat\Z/; # Match.
"cat\n" =~ /cat\z/; # No match.
"cat" =~ /\bcat\b/; # Matches.
"cats" =~ /\bcat\b/; # No match.
"cat" =~ /\bcat\B/; # No match.
"cats" =~ /\bcat\B/; # Match.
while ("cat dog" =~ /(\w+)/g) {
print $1; # Prints 'catdog'
}
while ("cat dog" =~ /\G(\w+)/g) {
print $1; # Prints 'cat'
}
my $s = "He said, \"Is pi 3.14? (I'm not sure).\"";
print join("|", $s =~ m/ ( .+? \b ) /xg), "\n";
print join("|", $s =~ m/ ( .+? \b{wb} ) /xg), "\n";
prints
He| |said|, "|Is| |pi| |3|.|14|? (|I|'|m| |not| |sure
He| |said|,| |"|Is| |pi| |3.14|?| |(|I'm| |not| |sure|)|.|" Разное
Здесь мы документируем последовательности с обратным слэшем, которые не попадают ни в одну из вышеперечисленных категорий. Это:
- \K
-
Это появилось в perl 5.10.0. Любое совпадение слева от
\Kне включается в$&, и не будет заменено, если шаблон используется в замене. Это позволяет написатьs/PAT1 \K PAT2/REPL/xвместоs/(PAT1) PAT2/${1}REPL/xилиs/(?<=PAT1) PAT2/REPL/x.Мнемоника: Kратить.
- \N
-
Эта функция, доступная начиная с версии 5.12, соответствует любому символу, который не является символом новой строки. Это сокращение для записи
[^\n], и идентично метасимволу., за исключением флага/s, который меняет значение., но не\N.Обратите внимание, что
\N{...}может означать названный или пронумерованный символ.Мнемоника: Дополнение к \n.
- \R
-
\Rсоответствует общей новой строке; то есть, любому, что считается последовательностью перевода строки в Unicode. Это включает в себя все символы, соответствующие\v(вертикальное пробельное пространство), и многосимвольную последовательность"\x0D\x0A"(возврат каретки, за которым следует перевод строки, иногда называемый сетевым переводом строки; это последовательность конца строки, используемая в текстовых файлах Microsoft, открытых в двоичном режиме).\Rэквивалентно(?>\x0D\x0A|\v). (Причина, по которой она не возвращается назад, заключается в том, что последовательность считается неразрывной. Это означает, что"\x0D\x0A" =~ /^\R\x0A$/ # No matchне выполняется, потому что
\Rсоответствует всей строке и не вернется назад, чтобы соответствовать только"\x0D".) Поскольку\Rможет соответствовать последовательности более чем одного символа, она не может быть помещена внутри квадратной скобки;/[\R]/- ошибка; используйте\vвместо этого.\Rбыла введена в perl 5.10.0.Обратите внимание, что это не учитывает локаль, которая может быть активна; соответствие происходит в соответствии с родным набором символов платформы.
Мнемоника: нет, на самом деле.
\Rбыла выбрана, потому что PCRE уже использует\R, и что ещё важнее, потому что Unicode рекомендует такой метасимвол регулярных выражений и предлагает\Rв качестве его обозначения. - \X
-
Это соответствует кластеру расширенных графем Unicode.
\Xдовольно хорошо соответствует тому, что обычное (не связанное с программированием Unicode) использование сочтет одним символом. Например, рассмотрите G с каким-либо диакритическим знаком, например, стрелкой. В Unicode такого отдельного символа нет, но его можно составить, используя G, за которым следует Unicode "СОЧЕТАНИЕ ВВЕРХУ СТРЕЛКИ НИЖЕ", и программное обеспечение, осознающее Unicode, отобразит его так, как если бы это был один символ.Соответствие жадное и необратимое, так что кластер никогда не разбивается на более мелкие компоненты.
См. также
\b{gcb}.Мнемоника: расширенный символ Unicode.
Примеры
$str =~ s/foo\Kbar/baz/g; # Change any 'bar' following a 'foo' to 'baz'
$str =~ s/(.)\K\g1//g; # Delete duplicated characters.
"\n" =~ /^\R$/; # Match, \n is a generic newline.
"\r" =~ /^\R$/; # Match, \r is a generic newline.
"\r\n" =~ /^\R$/; # Match, \r\n is a generic newline.
"P\x{307}" =~ /^\X$/ # \X matches a P with a dot above.
© 1993–2021 Larry Wall and others
Licensed under the GNU General Public License version 1 or later, or the Artistic License.
The Perl logo is a trademark of the Perl Foundation.
https://perldoc.perl.org/5.36.0/perlrebackslash