Spec-Zone.ru › Perl 5.34

perlrecharclass

СОДЕРЖАНИЕ

  • НАЗВАНИЕ
  • ОПИСАНИЕ
    • Точка
    • Последовательности обратного слэша
      • \N
      • Цифры
      • Символы слова
      • Пробелы
      • Свойства Юникода
        • Примеры
    • Классы символов в квадратных скобках
      • Специальные символы внутри класса символов в квадратных скобках
      • Классы символов в квадратных скобках и модификатор шаблона /xx
      • Диапазоны символов
      • Отрицание
      • Последовательности обратного слэша
      • Классы символов POSIX
        • Отрицание классов символов POSIX
        • [= =] и [. .]
        • Примеры
      • Расширенные классы символов в квадратных скобках

НАЗВАНИЕ

perlrecharclass - Классы символов Perl регулярных выражений

ОПИСАНИЕ

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

В данном руководстве описывается синтаксис и использование классов символов в Perl регулярных выражениях.

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

Существует три типа классов символов в Perl регулярных выражениях: точка, последовательности обратного слэша и форма в квадратных скобках. Однако часто термин «класс символов» используется для обозначения только формы в квадратных скобках. Определённо, большая часть документации Perl это делает.

Точка

Точка (или период), . — пожалуй, наиболее используемый и, безусловно, наиболее известный класс символов. По умолчанию точка соответствует любому символу, кроме новой строки. Это значение по умолчанию можно изменить, добавив соответствие новой строки, используя модификатор одной строки: для всего регулярного выражения с модификатором /s или локально с (?s) (и даже глобально в рамках области действия use re '/s'). (Последовательность обратного слэша "\N", описанная ниже, соответствует любому символу, кроме новой строки, независимо от модификатора регулярного выражения одной строки.)

Вот некоторые примеры:

"a"  =~  /./       # Match
"."  =~  /./       # Match
""   =~  /./       # No match (dot has to match a character)
"\n" =~  /./       # No match (dot does not match a newline)
"\n" =~  /./s      # Match (global 'single line' modifier)
"\n" =~  /(?s:.)/  # Match (local 'single line' modifier)
"ab" =~  /^.$/     # No match (dot matches one character)

Последовательности обратного слэша

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

Вот список последовательностей обратного слэша, которые являются классами символов. Они обсуждаются более подробно ниже. (Для последовательностей обратного слэша, которые не являются классами символов, см. perlrebackslash.)

\d             Match a decimal digit character.
\D             Match a non-decimal-digit character.
\w             Match a "word" character.
\W             Match a non-"word" character.
\s             Match a whitespace character.
\S             Match a non-whitespace character.
\h             Match a horizontal whitespace character.
\H             Match a character that isn't horizontal whitespace.
\v             Match a vertical whitespace character.
\V             Match a character that isn't vertical whitespace.
\N             Match a character that isn't a newline.
\pP, \p{Prop}  Match a character that has the given Unicode property.
\PP, \P{Prop}  Match a character that doesn't have the Unicode property

\N

\N, доступная начиная с версии 5.12, как и точка, соответствует любому символу, кроме новой строки. Разница заключается в том, что \N не зависит от модификатора регулярного выражения одной строки (см. "Точка" выше). Обратите внимание, что форма \N{...} может означать совершенно другое. Когда {...} является квантификатором, это означает сопоставление символа, не являющегося новой строкой, многократно. Например, \N{3} означает сопоставление 3 символов, не являющихся новой строкой; \N{5,} означает сопоставление 5 или более символов, не являющихся новой строкой. Но если {...} не является допустимым квантификатором, предполагается, что это именованный символ. См. charnames для них. Например, ни \N{COLON}, ни \N{4F}, ни \N{F4} не содержат допустимых квантификаторов, поэтому Perl попытается найти символы, имена которых соответственно COLON, 4F, и F4.

Цифры

\d соответствует одному символу, считающемуся десятичной цифрой. Если в действии находится модификатор регулярного выражения /a, он соответствует [0-9]. В противном случае он соответствует всему, что соответствует \p{Digit}, что включает [0-9]. (Вероятное исключение заключается в том, что в соответствии с правилами локали соответствия текущая локаль может не иметь [0-9] соответствует \d, и/или может соответствовать другим символам, код которых меньше 256. Единственные допустимые определения локали будут состоять в том, чтобы сопоставить [0-9] плюс еще один набор из 10 последовательных цифровых символов; всё остальное будет нарушением стандарта языка C, но Perl на данный момент ничего не предполагает по этому поводу.)

Это означает, что, если не используется модификатор /a, \d соответствует не только цифрам '0' - '9', но и арабским, деванагари и цифрам других языков. Это может вызвать некоторое недопонимание и некоторые проблемы с безопасностью.

Некоторые цифры, которые \d соответствует, похожи на некоторые из [0-9], но имеют разные значения. Например, бенгальская цифра четыре (U+09EA) очень похожа на ASCII цифру восемь (U+0038), а лепча цифра шесть (U+1C46) очень похожа на ASCII цифру пять (U+0035). Приложение, которое ожидает только ASCII-цифры, может быть введено в заблуждение, или если соответствие — \d+, сопоставленная строка может содержать смесь цифр из разных систем письма, которые выглядят так, как будто они обозначают число, отличное от фактического. "num()" в Unicode::UCD можно использовать для безопасного расчета значения, возвращая undef если входная строка содержит такую смесь. В противном случае, например, отображаемая цена может быть намеренно отличной от визуального представления.

Что означает \p{Digit} (и следовательно \d за исключением модификатора /a) — \p{General_Category=Decimal_Number}, или, синонимично, \p{General_Category=Digit}. Начиная с версии 4.1 Unicode, это тот же набор символов, что и \p{Numeric_Type=Decimal}. Но в Unicode есть и другое свойство с похожим названием, \p{Numeric_Type=Digit}, которое сопоставляет совершенно другой набор символов. К этим символам относятся такие вещи, как CIRCLED DIGIT ONE или индексы, или символы из систем письма, в которых отсутствуют все десять цифр.

Цель проектирования — чтобы \d точно соответствовал набору символов, которые можно безопасно использовать с «обычным» десятичным синтаксисом с большим эндианством, в котором, например, 123 означает «сто», плюс «два десятка», плюс «три единицы». Это позиционное обозначение не обязательно относится к символам, которые сопоставляются с другим типом «цифры», \p{Numeric_Type=Digit}, и поэтому \d не сопоставляет их.

Тамильские цифры (U+0BE6 - U+0BEF) также могут быть законно использованы в тамильских числах старого стиля, в которых они могут появляться не более чем по одному в строке, разделенные символами, обозначающими «умножить на 10», «умножить на 100» и т. д. (См. https://www.unicode.org/notes/tn21.)

Любой символ, не сопоставляемый с \d, сопоставляется с \D.

Символы слова

\w соответствует одному буквенно-цифровому символу (буквенный символ или десятичная цифра); или знаку препинания соединения, например, подчеркиванию («_»); или символу «метки» (например, какому-либо акценту), который прикрепляется к одному из них. Он не соответствует целому слову. Чтобы сопоставить целое слово, используйте \w+. Это не то же самое, что сопоставление английского слова, но в диапазоне ASCII это то же самое, что строка символов идентификаторов Perl.

Если модификатор /a активен…

\w соответствует 63 символам [a-zA-Z0-9_].

иначе…
Для кодовых точек выше 255…

\w соответствует тому же, что и \p{Word} соответствует в этом диапазоне. То есть он соответствует тайским буквам, греческим буквам и т. д. Это включает знаки препинания соединения (например, подчеркивание), которые соединяют два слова вместе, или диакритические знаки, такие как COMBINING TILDE и модификаторы букв, которые обычно используются для добавления вспомогательных обозначений к буквам.

Для кодовых точек ниже 256…
если правила локали активны…

\w соответствует символу подчеркивания на платформе плюс любые буквенно-цифровые символы, которые локаль считает буквенно-цифровыми.

если вместо этого активны правила Юникода…

\w соответствует ровно тому, что \p{Word} соответствует.

иначе…

\w соответствует [a-zA-Z0-9_].

Какие правила применяются, определяется, как описано в "Какой модификатор набора символов активен?" в perlre.

Существует ряд проблем с безопасностью полного списка символов слов Юникода. См. http://unicode.org/reports/tr36.

Также для более подробного набора символов, которые находятся в идентификаторах языков программирования за пределами ASCII-диапазона, вы можете использовать более настраиваемые "Свойства Юникода", \p{ID_Start}, \p{ID_Continue}, \p{XID_Start}, и \p{XID_Continue}. См. http://unicode.org/reports/tr31.

Любой символ, не сопоставляемый с \w, сопоставляется с \W.

Пробелы

\s соответствует любому одиночному символу, считающемуся пробелом.

Если в действии модификатор /a ...

Во всех версиях Perl, \s соответствует 5 символам [\t\n\f\r ]; то есть, горизонтальной табуляции, новой строке, форме подачи, возврату каретки и пробелу. Начиная с Perl v5.18, он также соответствует вертикальной табуляции, \cK. См. Примечание [1] ниже для обсуждения этого.

в противном случае ...
Для кодовых точек выше 255 ...

\s соответствует точно кодовым точкам выше 255, показанным со столбцом "s" в таблице ниже.

Для кодовых точек ниже 256 ...
если правила локали активны ...

\s соответствует тому, что локаль считает пробелом.

если, вместо этого, действуют правила Unicode ...

\s соответствует точно символам, показанным в столбце "s" в таблице ниже.

в противном случае ...

\s соответствует [\t\n\f\r ] и, начиная с Perl v5.18, вертикальной табуляции, \cK. (См. Примечание [1] ниже для обсуждения этого.) Обратите внимание, что этот список не включает неразрывный пробел.

Какие правила применяются, определяется, как описано в "Which character set modifier is in effect?" в perlre.

Любой символ, не соответствующий \s, соответствует \S.

\h соответствует любому символу, считающемуся горизонтальным пробелом; это включает пробелы и символы табуляции платформы, а также несколько других, перечисленных в таблице ниже. \H соответствует любому символу, не считающемуся горизонтальным пробелом. Они используют родную кодировку платформы и не учитывают никакую локаль, которая может быть в употреблении.

\v соответствует любому символу, считающемуся вертикальным пробелом; это включает символы возврата каретки и перевода строки (новая строка) платформы, а также несколько других символов, все перечисленные в таблице ниже. \V соответствует любому символу, не считающемуся вертикальным пробелом. Они используют родную кодировку платформы и не учитывают никакую локаль, которая может быть в употреблении.

\R соответствует любому символу, который может рассматриваться как символ новой строки в соответствии с правилами Unicode. Он может соответствовать многосимвольному последовательности. Он не может использоваться внутри скобочной группы символов; используйте \v вместо этого (вертикальный пробел). Он использует родную кодировку платформы и не учитывает никакую локаль, которая может быть в употреблении. Подробности обсуждаются в perlrebackslash.

Обратите внимание, что в отличие от \s (и \d и \w), \h и \v всегда соответствуют тем же символам, независимо от других факторов, таких как активная локаль или является ли исходная строка в формате UTF-8.

Можно подумать, что \s эквивалентно [\h\v]. Это действительно так, начиная с Perl v5.18, но до этого единственное отличие заключалось в том, что вертикальная табуляция ("\cK") не соответствовала \s.

Следующая таблица является полным списком символов, соответствующих \s, \h и \v по состоянию на Unicode 6.3.

Первый столбец содержит кодовую точку Unicode символа (в шестнадцатеричном формате), второй столбец — (Unicode) имя. Третий столбец указывает классы(ы), которым соответствует символ (если никакая локаль не введена в действие, которая меняет \s соответствие).

0x0009        CHARACTER TABULATION   h s
0x000a              LINE FEED (LF)    vs
0x000b             LINE TABULATION    vs  [1]
0x000c              FORM FEED (FF)    vs
0x000d        CARRIAGE RETURN (CR)    vs
0x0020                       SPACE   h s
0x0085             NEXT LINE (NEL)    vs  [2]
0x00a0              NO-BREAK SPACE   h s  [2]
0x1680            OGHAM SPACE MARK   h s
0x2000                     EN QUAD   h s
0x2001                     EM QUAD   h s
0x2002                    EN SPACE   h s
0x2003                    EM SPACE   h s
0x2004          THREE-PER-EM SPACE   h s
0x2005           FOUR-PER-EM SPACE   h s
0x2006            SIX-PER-EM SPACE   h s
0x2007                FIGURE SPACE   h s
0x2008           PUNCTUATION SPACE   h s
0x2009                  THIN SPACE   h s
0x200a                  HAIR SPACE   h s
0x2028              LINE SEPARATOR    vs
0x2029         PARAGRAPH SEPARATOR    vs
0x202f       NARROW NO-BREAK SPACE   h s
0x205f   MEDIUM MATHEMATICAL SPACE   h s
0x3000           IDEOGRAPHIC SPACE   h s
[1]

До Perl v5.18, \s не соответствовал вертикальной табуляции. [^\S\cK] (загадочно) соответствует тому, что \s традиционно делал.

[2]

NEXT LINE и NO-BREAK SPACE могут или не могут соответствовать \s в зависимости от действующих правил. См. начало этого раздела.

Свойства Unicode

\pP и \p{Prop} — это классы символов для соответствия символам, которые соответствуют заданным свойствам Unicode. Имена свойств одной буквы могут использоваться в форме \pP, где за \p следует имя свойства; в противном случае требуются фигурные скобки. При использовании фигурных скобок существует одна форма, которая представляет собой просто имя свойства, заключенное в фигурные скобки, и составная форма, которая выглядит как \p{name=value}, что означает соответствие, если свойство "имя" для символа имеет это конкретное "значение". Например, соответствие для числа можно записать как /\pN/ или как /\p{Number}/, или как /\p{Number=True}/.

Маленькие буквы соответствуют свойству Lowercase_Letter, которое имеет короткую форму Ll. Для них нужны фигурные скобки, поэтому они записываются как /\p{Ll}/ или /\p{Lowercase_Letter}/, или /\p{General_Category=Lowercase_Letter}/ (подчеркивания необязательны). /\pLl/ допустимо, но означает что-то другое. Оно соответствует строке из двух символов: буква (свойство Unicode \pL), за которой следует строчная буква l.

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

Обратите внимание, что почти все свойства невосприимчивы к сопоставлению без учета регистра. То есть, добавление модификатора регулярного выражения /i не изменяет то, чему они соответствуют. Но есть два набора, которые подвержены воздействию. Первый набор — это Uppercase_Letter, Lowercase_Letter и Titlecase_Letter, все из которых соответствуют Cased_Letter при сопоставлении без учета регистра /i. Второй набор — Uppercase, Lowercase и Titlecase, все из которых соответствуют Cased при сопоставлении без учета регистра /i.

(Разница между этими наборами в том, что некоторые вещи, такие как римские цифры, встречаются как в верхнем, так и в нижнем регистре, поэтому они Cased, но не считаются буквами, поэтому они не являются Cased_Letters. Они на самом деле Letter_Numbers.) Этот набор также включает свои подмножества PosixUpper и PosixLower, оба из которых при сопоставлении без учёта регистра /i соответствуют PosixAlpha.

Для получения более подробной информации о свойствах Unicode см. "Unicode Character Properties" в perlunicode; для получения полного списка возможных свойств см. "Properties accessible through \p{} and \P{}" в perluniprops, который отмечает все формы, имеющие /i различия. Также возможно определить свои собственные свойства. Об этом говорится в "User-Defined Character Properties" в perlunicode.

Свойства Unicode определены (неудивительно!) только для точек кода Unicode. Начиная с v5.20, при сопоставлении с \p и \P, Perl обрабатывает точки кода, не являющиеся Unicode (те, которые выше допустимого максимального значения Unicode 0x10FFFF), как если бы они были типичными неопределёнными точками кода Unicode.

До v5.20 Perl выводил предупреждение и делал все сопоставления недействительными для точек кода, не являющихся Unicode. Это могло быть несколько неожиданно:

chr(0x110000) =~ \p{ASCII_Hex_Digit=True}     # Fails on Perls < v5.20.
chr(0x110000) =~ \p{ASCII_Hex_Digit=False}    # Also fails on Perls
                                              # < v5.20

Несмотря на то, что эти два соответствия можно рассматривать как дополнения, до v5.20 они были таковыми только для точек кода Unicode.

Начиная с perl v5.30, в значениях свойств Unicode разрешены подстановочные знаки. См. "Wildcards in Property Values" в perlunicode.

Примеры
"a"  =~  /\w/      # Match, "a" is a 'word' character.
"7"  =~  /\w/      # Match, "7" is a 'word' character as well.
"a"  =~  /\d/      # No match, "a" isn't a digit.
"7"  =~  /\d/      # Match, "7" is a digit.
" "  =~  /\s/      # Match, a space is whitespace.
"a"  =~  /\D/      # Match, "a" is a non-digit.
"7"  =~  /\D/      # No match, "7" is not a non-digit.
" "  =~  /\S/      # No match, a space is not non-whitespace.

" "  =~  /\h/      # Match, space is horizontal whitespace.
" "  =~  /\v/      # No match, space is not vertical whitespace.
"\r" =~  /\v/      # Match, a return is vertical whitespace.

"a"  =~  /\pL/     # Match, "a" is a letter.
"a"  =~  /\p{Lu}/  # No match, /\p{Lu}/ matches upper case letters.

"\x{0e0b}" =~ /\p{Thai}/  # Match, \x{0e0b} is the character
                          # 'THAI CHARACTER SO SO', and that's in
                          # Thai Unicode class.
"a"  =~  /\P{Lao}/ # Match, as "a" is not a Laotian character.

Стоит подчеркнуть, что \d, \w, и т.д. соответствуют отдельным символам, а не целым числам или словам. Чтобы соответствовать числу (состоящему из цифр), используйте \d+; чтобы соответствовать слову, используйте \w+. Но имейте в виду соображения безопасности при этом, как упоминалось выше.

Скобочные классы символов

Третья форма класса символов, которую вы можете использовать в регулярных выражениях Perl, — это скобочный класс символов. В его простейшей форме он перечисляет символы, которые могут быть сопоставлены, заключённые в квадратные скобки, например: [aeiou]. Это соответствует одному из a, e, i, o или u. Как и другие классы символов, ровно один символ сопоставляется.* Чтобы сопоставить более длинную строку, состоящую из символов, упомянутых в классе символов, следует за классом символов квантификатор. Например, [aeiou]+ соответствует одному или нескольким строчным гласным английским буквам.

Повторение символа в классе символов не оказывает никакого влияния; он считается в наборе только один раз.

Примеры:

"e"  =~  /[aeiou]/        # Match, as "e" is listed in the class.
"p"  =~  /[aeiou]/        # No match, "p" is not listed in the class.
"ae" =~  /^[aeiou]$/      # No match, a character class only matches
                          # a single character.
"ae" =~  /^[aeiou]+$/     # Match, due to the quantifier.

-------

* Есть два исключения из правила, что скобочный класс символов соответствует только одному символу. Каждый требует специальной обработки Perl, чтобы все работало:

  • Когда класс должен соответствовать без учёта регистра по правилам сопоставления /i, и символ, который явно указан внутри класса, соответствует многосимвольной последовательности без учёта регистра по правилам Unicode, класс также будет соответствовать этой последовательности. Например, Unicode говорит, что буква LATIN SMALL LETTER SHARP S должна соответствовать последовательности ss в соответствии с правилами /i. Таким образом,

    'ss' =~ /\A\N{LATIN SMALL LETTER SHARP S}\z/i             # Matches
    'ss' =~ /\A[aeioust\N{LATIN SMALL LETTER SHARP S}]\z/i    # Matches

    Для этого класс не должен быть инвертированным (см. "Инвертирование"), символ должен быть явно указан и не должен входить в многосимвольный диапазон (даже не в качестве одной из его конечных точек). ("Диапазоны символов" будут объяснены вскоре.) Следовательно,

    'ss' =~ /\A[\0-\x{ff}]\z/ui       # Doesn't match
    'ss' =~ /\A[\0-\N{LATIN SMALL LETTER SHARP S}]\z/ui   # No match
    'ss' =~ /\A[\xDF-\xDF]\z/ui   # Matches on ASCII platforms, since
                                  # \xDF is LATIN SMALL LETTER SHARP S,
                                  # and the range is just a single
                                  # element

    Обратите внимание, что не рекомендуется указывать подобные диапазоны.

  • Некоторые имена, известные \N{...}, ссылаются на последовательность из нескольких символов вместо обычного одиночного символа. Когда один из них включается в класс, вся последовательность сопоставляется. Например,

    "\N{TAMIL LETTER KA}\N{TAMIL VOWEL SIGN AU}"
                                =~ / ^ [\N{TAMIL SYLLABLE KAU}]  $ /x;

    сопоставляется, потому что \N{TAMIL SYLLABLE KAU} — это именованная последовательность, состоящая из двух символов, сопоставляемых. Подобно другому случаю, когда скобочный класс может сопоставлять несколько символов, и по схожим причинам, класс не должен быть инвертированным, и именованная последовательность не может появляться в диапазоне, даже если она является обеими конечными точками. Если это произойдёт, это ошибка, если скобочный класс находится в области действия use re 'strict или в расширенном (?[...]) классе; в противном случае используется только первая кодовая точка (с предупреждением типа regexp).

Специальные символы внутри квадратной скобки

Большинство символов, являющихся метасимволами в регулярных выражениях (то есть символы, которые имеют специальное значение, например ., *, или ( ), теряют свое специальное значение и могут быть использованы внутри класса символов без необходимости экранирования. Например, [()] соответствует либо открывающей, либо закрывающей скобке, а скобки внутри класса символов не группируют и не捕获. Имейте в виду, что, если шаблон не оценивается в контексте с одинарными кавычками, интерполяция переменных произойдет до парсинга класса в квадратных скобках:

$, = "\t| ";
$a =~ m'[$,]';        # single-quotish: matches '$' or ','
$a =~ q{[$,]}'        # same
$a =~ m/[$,]/;        # double-quotish: Because we made an
                      #   assignment to $, above, this now
                      #   matches "\t", "|", or " "

Символы, которые могут иметь специальное значение внутри класса символов, это: \, ^, -, [ и ], и рассматриваются ниже. Их можно экранировать с помощью обратного слэша, хотя это иногда не нужно, в этом случае обратный слэш может быть опущен.

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

Последовательности \a, \c, \e, \f, \n, \N{NAME}, \N{U+hex char}, \r, \t, и \x также являются специальными и имеют те же значения, что и вне квадратной скобки.

Кроме того, обратный слэш, за которым следуют две или три восьмеричные цифры, рассматривается как восьмеричное число.

[ не является специальным символом внутри класса символов, если это не начало класса символов POSIX (см. "Классы символов POSIX" ниже). Обычно его не нужно экранировать.

] обычно является концом класса символов POSIX (см. "Классы символов POSIX" ниже) или указывает на конец класса символов в квадратных скобках. Если вы хотите включить ] в набор символов, его обычно необходимо экранировать.

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

Примеры:

"+"   =~ /[+?*]/     #  Match, "+" in a character class is not special.
"\cH" =~ /[\b]/      #  Match, \b inside in a character class
                     #  is equivalent to a backspace.
"]"   =~ /[][]/      #  Match, as the character class contains
                     #  both [ and ].
"[]"  =~ /[[]]/      #  Match, the pattern contains a character class
                     #  containing just [, and the character class is
                     #  followed by a ].

Классы символов в квадратных скобках и модификатор шаблона /xx

Обычно символы ПРОБЕЛА и ТАБУляции не имеют специального значения внутри класса символов в квадратных скобках; они просто добавляются в список символов, соответствующих классу. Но если модификатор шаблона /xx активен, они обычно игнорируются и могут быть добавлены для улучшения удобочитаемости. Их нельзя добавить посередине отдельной конструкции:

/ [ \x{10 FFFF} ] /xx  # WRONG!

ПРОБЕЛ посередине шестнадцатеричной константы недопустим.

Чтобы указать символ ПРОБЕЛА, можно экранировать его обратным слэшем, например:

/[ a e i o u \  ]/xx

Это соответствует английским гласным плюс символу ПРОБЕЛА.

Для ясности, вы уже должны использовать \t для указания символа табуляции, а \t не затрагивается /xx.

Диапазоны символов

Часто требуется сопоставление диапазона символов. К счастью, вместо перечисления всех символов в диапазоне можно использовать дефис (-). Если внутри класса символов в квадратных скобках есть два символа, разделенных дефисом, он обрабатывается как если бы все символы между двумя символами были в классе. Например, [0-9] соответствует любой десятичной цифре, а [a-m] соответствует любой строчной букве из первой половины ASCII-алфавита.

Обратите внимание, что два символа по обе стороны от дефиса не обязательно являются буквами или цифрами. Возможен любой символ, хотя это не рекомендуется. ['-?] содержит диапазон символов, но большинство людей не знают, какие символы это означают. Кроме того, такие диапазоны могут привести к проблемам переносимости, если код должен выполняться на платформе, использующей другой набор символов, например EBCDIC.

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

Примеры:

[a-z]       #  Matches a character that is a lower case ASCII letter.
[a-fz]      #  Matches any letter between 'a' and 'f' (inclusive) or
            #  the letter 'z'.
[-z]        #  Matches either a hyphen ('-') or the letter 'z'.
[a-f-m]     #  Matches any letter between 'a' and 'f' (inclusive), the
            #  hyphen ('-'), or the letter 'm'.
['-?]       #  Matches any of the characters  '()*+,-./0123456789:;<=>?
            #  (But not on an EBCDIC platform).
[\N{APOSTROPHE}-\N{QUESTION MARK}]
            #  Matches any of the characters  '()*+,-./0123456789:;<=>?
            #  even on an EBCDIC platform.
[\N{U+27}-\N{U+3F}] # Same. (U+27 is "'", and U+3F is "?")

Как показывают два последних примера выше, вы можете добиться переносимости на платформы, отличные от ASCII, используя форму \N{...} для конечных точек диапазона. Они указывают, что указанный диапазон должен интерпретироваться с использованием значений Unicode, поэтому [\N{U+27}-\N{U+3F}] означает соответствие \N{U+27}, \N{U+28}, \N{U+29}, ..., \N{U+3D}, \N{U+3E}, и \N{U+3F}, какими бы ни были родные кодовые точки для этих символов. Эти диапазоны называются «Unicode». Если любой конец имеет форму \N{...}, диапазон считается Unicode. Предупреждение regexp поднимается в "use re 'strict'" если другая конечная точка указана непереносимым образом:

[\N{U+00}-\x09]    # Warning under re 'strict'; \x09 is non-portable
[\N{U+00}-\t]      # No warning;

Оба вышеуказанных соответствия символам \N{U+00} \N{U+01}, ... \N{U+08}, \N{U+09}, но \x09 выглядит как ошибка, поэтому предупреждение поднимается (в re 'strict') для него.

Perl также гарантирует, что диапазоны A-Z, a-z, 0-9, и любые поддиапазоны этих диапазонов соответствуют тому, чего ожидал бы носитель английского языка на любой платформе. То есть, [A-Z] соответствует 26 прописным буквам ASCII; [a-z] соответствует 26 строчным буквам; и [0-9] соответствует 10 цифрам. Поддиапазоны, такие как [h-k], соответствуют соответствующим образом, в данном случае только четырем буквам "h", "i", "j", и "k". Это естественное поведение на платформах ASCII, где кодовые точки (порядковые значения) для "h" до "k" являются последовательными целыми числами (0x68 до 0x6B). Но для платформ с нативным набором символов, отличным от ASCII, может потребоваться специальная обработка. Например, на платформах EBCDIC кодовая точка для "h" равна 0x88, "i" равна 0x89, "j" равна 0x91, а "k" равна 0x92. Perl специально обрабатывает [h-k] для исключения семи кодовых точек в разрыве: от 0x8A до 0x90. Эта специальная обработка вызывается только тогда, когда диапазон является поддиапазоном одного из диапазонов ASCII (прописных, строчных и цифр) И каждая конечная точка диапазона выражена либо как буквальный символ, например "A", либо как именованный символ (\N{...}, включая форму \N{U+...).

Примеры EBCDIC:

[i-j]               #  Matches either "i" or "j"
[i-\N{LATIN SMALL LETTER J}]  # Same
[i-\N{U+6A}]        #  Same
[\N{U+69}-\N{U+6A}] #  Same
[\x{89}-\x{91}]     #  Matches 0x89 ("i"), 0x8A .. 0x90, 0x91 ("j")
[i-\x{91}]          #  Same
[\x{89}-j]          #  Same
[i-J]               #  Matches, 0x89 ("i") .. 0xC1 ("J"); special
                    #  handling doesn't apply because range is mixed
                    #  case

Отрицание

Также можно указать символы, которые не должны сопоставляться. Это можно сделать, используя символ «^» (^) в качестве первого символа в классе символов. Например, [^a-z] соответствует любому символу, который не является строчной буквой ASCII, что включает более миллиона кодовых точек Unicode. Говорят, что класс «отрицается» или «инвертируется».

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

В инвертированных классах символов в квадратных скобках Perl игнорирует правила Unicode, которые обычно говорят, что именованные последовательности и определенные символы должны соответствовать последовательности из нескольких символов при использовании соответствия без учета регистра /i. Следование этим правилам может привести к очень запутанным ситуациям:

"ss" =~ /^[^\xDF]+$/ui;   # Matches!

Это должно сопоставлять любые последовательности символов, которые не \xDF и не соответствуют \xDF в режиме /i. "s" не \xDF, но Unicode говорит, что "ss" соответствует \xDF в режиме /i. Какой из них «выигрывает»? Отклонить соответствие, потому что строка имеет ss, или принять её, потому что она имеет s за которым следует ещё один s? Perl выбрал второй вариант. (См. примечание в "Классах символов в квадратных скобках" выше.)

Примеры:

"e"  =~  /[^aeiou]/   #  No match, the 'e' is listed.
"x"  =~  /[^aeiou]/   #  Match, as 'x' isn't a lowercase vowel.
"^"  =~  /[^^]/       #  No match, matches anything that isn't a caret.
"^"  =~  /[x^]/       #  Match, caret is not special here.

Последовательности обратного слэша

Можно поместить любой символ класса символов в обратном слэше (за исключением \N и \R ) внутри класса символов в квадратных скобках, и он будет действовать так, как будто вы поместили все символы, сопоставляемые с последовательностью обратного слэша, внутрь класса символов. Например, [a-f\d] соответствует любой десятичной цифре или любой строчной букве от 'a' до 'f' включительно.

\N внутри класса символов в квадратных скобках должен иметь форму \N{name} или \N{U+hex char}, и НЕ быть формой, которая соответствует не-новым строкам, по той же причине, что точка . внутри класса символов в квадратных скобках теряет свое специальное значение: она соответствует почти любому символу, что обычно не то, что вы хотите.

Примеры:

/[\p{Thai}\d]/     # Matches a character that is either a Thai
                   # character, or a digit.
/[^\p{Arabic}()]/  # Matches a character that is neither an Arabic
                   # character, nor a parenthesis.

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

/[\p{Thai}-\d]/     # Wrong!

Классы символов POSIX

Классы символов POSIX имеют вид [:class:], где class - это имя, а [: и :] - разделители. Классы символов POSIX появляются только внутри классов символов в квадратных скобках и являются удобным и описательным способом перечисления группы символов.

Будьте осторожны с синтаксисом,

# Correct:
$string =~ /[[:alpha:]]/

# Incorrect (will warn):
$string =~ /[:alpha:]/

Последний шаблон будет классом символов, состоящим из двоеточия и букв a, l, p и h.

Классы символов POSIX могут быть частью более крупного класса символов в квадратных скобках. Например,

[01[:alpha:]%]

является допустимым и соответствует '0', '1', любым буквенным символам и знаку процента.

Perl распознает следующие классы символов POSIX:

alpha  Any alphabetical character (e.g., [A-Za-z]).
alnum  Any alphanumeric character (e.g., [A-Za-z0-9]).
ascii  Any character in the ASCII character set.
blank  A GNU extension, equal to a space or a horizontal tab ("\t").
cntrl  Any control character.  See Note [2] below.
digit  Any decimal digit (e.g., [0-9]), equivalent to "\d".
graph  Any printable character, excluding a space.  See Note [3] below.
lower  Any lowercase character (e.g., [a-z]).
print  Any printable character, including a space.  See Note [4] below.
punct  Any graphical character excluding "word" characters.  Note [5].
space  Any whitespace character. "\s" including the vertical tab
       ("\cK").
upper  Any uppercase character (e.g., [A-Z]).
word   A Perl extension (e.g., [A-Za-z0-9_]), equivalent to "\w".
xdigit Any hexadecimal digit (e.g., [0-9a-fA-F]).  Note [7].

Как и свойства Unicode, большинство свойств POSIX совпадают независимо от того, используется ли соответствие без учёта регистра (/i) или нет. Исключение составляют [:upper:] и [:lower:]. В случае /i, они соответствуют объединению [:upper:] и [:lower:].

У большинства POSIX-классов символов есть два аналога-свойства в стиле Unicode \p. (Они не являются официальными свойствами Unicode, а являются расширениями Perl, полученными из официальных свойств Unicode.) Таблица ниже показывает соотношение между POSIX-классами символов и этими аналогами.

Один аналог, в столбце, обозначенном «ASCII-диапазон Unicode», соответствует только символам в наборе символов ASCII.

Другой аналог, в столбце, обозначенном «Полный диапазон Unicode», соответствует любым соответствующим символам в полном наборе символов Unicode. Например, \p{Alpha} соответствует не только буквенным символам ASCII, но и любому символу в полном наборе символов Unicode, рассматриваемому как буквенный символ. Элемент в столбце «последовательность обратной косой черты» — это (короткое) эквивалентное значение.

[[:...:]]      ASCII-range          Full-range  backslash  Note
                Unicode              Unicode     sequence
-----------------------------------------------------
  alpha      \p{PosixAlpha}       \p{XPosixAlpha}
  alnum      \p{PosixAlnum}       \p{XPosixAlnum}
  ascii      \p{ASCII}
  blank      \p{PosixBlank}       \p{XPosixBlank}  \h      [1]
                                  or \p{HorizSpace}        [1]
  cntrl      \p{PosixCntrl}       \p{XPosixCntrl}          [2]
  digit      \p{PosixDigit}       \p{XPosixDigit}  \d
  graph      \p{PosixGraph}       \p{XPosixGraph}          [3]
  lower      \p{PosixLower}       \p{XPosixLower}
  print      \p{PosixPrint}       \p{XPosixPrint}          [4]
  punct      \p{PosixPunct}       \p{XPosixPunct}          [5]
             \p{PerlSpace}        \p{XPerlSpace}   \s      [6]
  space      \p{PosixSpace}       \p{XPosixSpace}          [6]
  upper      \p{PosixUpper}       \p{XPosixUpper}
  word       \p{PosixWord}        \p{XPosixWord}   \w
  xdigit     \p{PosixXDigit}      \p{XPosixXDigit}         [7]
[1]

\p{Blank} и \p{HorizSpace} являются синонимами.

[2]

Управляющие символы не выводят результат как таковой, а вместо этого обычно каким-то образом управляют терминалом: например, перевод строки и возврат каретки являются управляющими символами. На платформах ASCII, в диапазоне ASCII, символы, у которых коды значений находятся между 0 и 31 включительно, плюс 127 (DEL) являются управляющими символами; на платформах EBCDIC, их аналоги являются управляющими символами.

[3]

Любой символ, который является графическим, то есть видимым. Этот класс состоит из всех буквенно-цифровых символов и всех знаков препинания.

[4]

Все печатаемые символы, которые представляют собой множество всех графических символов плюс те символы пробелов, которые не являются также управляющими символами.

[5]

\p{PosixPunct} и [[:punct:]] в диапазоне ASCII соответствуют всем символам, которые не являются управляющими, буквенно-цифровыми или пробельными символами: [-!"#$%&'()*+,./:;<=>?@[\\\]^_`{|}~] (хотя если активен локаль, он может изменить поведение [[:punct:]]).

Аналогичное свойство, \p{Punct}, соответствует несколько другому набору в диапазоне ASCII, а именно [-!"#%&'()*,./:;?@[\\\]_{}]. То есть ему не хватает девяти символов [$+<=>^`|~]. Это связано с тем, что Unicode разделяет то, что POSIX рассматривает как знаки препинания, на две категории: знаки препинания и символы.

\p{XPosixPunct} и (в соответствии с правилами Unicode) [[:punct:]], соответствуют тому, что \p{PosixPunct} соответствует в диапазоне ASCII, плюс тому, что \p{Punct} соответствует. Это отличается от строгого соответствия по \p{Punct}. Другой способ сказать это заключается в том, что если правила Unicode активны, [[:punct:]] соответствует всем символам, которые Unicode рассматривает как знаки препинания, плюс все символы из диапазона ASCII, которые Unicode рассматривает как символы.

[6]

\p{XPerlSpace} и \p{Space} совпадают начиная с Perl v5.18. В более ранних версиях они отличаются только тем, что при соответствии без учёта локали \p{XPerlSpace} не соответствовало вертикальной вкладке, \cK. То же самое относится и к двум формам ASCII-только диапазонов.

[7]

В отличие от [[:digit:]], которое соответствует цифрам во многих системах письма, таких как тайский и деванагари, в настоящее время существует всего два набора шестнадцатеричных цифр, и маловероятно, что их будет добавлено больше. Это связано с тем, что вам не только нужны десять цифр, но и шесть [A-F] (и [a-f]) для соответствия. Это означает, что для этих целей подходит только латинский алфавит, и Unicode имеет только два набора этих, знакомый набор ASCII и формы с полным расширением, начиная с U+FF10 (FULLWIDTH DIGIT ZERO).

Существует множество других синонимов, которые можно использовать помимо указанных в таблице имён. Например, \p{XPosixAlpha} можно записать как \p{Alpha}. Все они перечислены в "Свойства, доступные через \p{} и \P{}" в perluniprops.

Оба аналога \p всегда предполагают, что правила Unicode активны. На платформах ASCII это означает, что они предполагают, что коды значений с 128 по 255 относятся к Latin-1, а это означает, что их использование в правилах локали нежелательно, если локаль не гарантированно является Latin-1 или UTF-8. В отличие от этого, POSIX-классы символов полезны в правилах локали. Они влияют на фактические активные правила следующим образом:

Если используется модификатор /a ...

Каждый из POSIX-классов соответствует точно так же, как и их аналоги ASCII-диапазона.

в противном случае ...
Для кодов значений выше 255 ...

POSIX-класс соответствует тому же, что и его аналог Полного диапазона.

Для кодов значений ниже 256 ...
если правила локали активны ...

POSIX-класс соответствует правилам локали, за исключением:

word

также включает собственный символ подчёркивания платформы, независимо от локали.

ascii

на платформах, которые не имеют расширения POSIX ascii, это соответствует только собственным символам платформы в диапазоне ASCII.

blank

на платформах, которые не имеют расширения POSIX blank, это соответствует только вкладочным и пробельным символам платформы.

если вместо этого активны правила Unicode ...

POSIX-класс соответствует тому же, что и аналог Полного диапазона.

в противном случае ...

POSIX-класс соответствует тому же, что и аналог ASCII-диапазона.

Какие правила применяются, определяется, как описано в "Какой модификатор набора символов активен?" в perlre.

Отрицание POSIX-классов символов

Расширением Perl для класса символов POSIX является возможность его отрицания. Это делается путём добавления символа «^» (^) перед именем класса. Некоторые примеры:

    POSIX         ASCII-range     Full-range  backslash
                   Unicode         Unicode    sequence
-----------------------------------------------------
[[:^digit:]]   \P{PosixDigit}  \P{XPosixDigit}   \D
[[:^space:]]   \P{PosixSpace}  \P{XPosixSpace}
               \P{PerlSpace}   \P{XPerlSpace}    \S
[[:^word:]]    \P{PerlWord}    \P{XPosixWord}    \W

Последовательность обратной косой черты может означать либо ASCII, либо Unicode полного диапазона, в зависимости от различных факторов, как описано в "Какой модификатор набора символов активен?" в perlre.

[= =] и [. .]

Perl распознаёт POSIX-классы символов [=class=] и [.class.], но пока не поддерживает их. Любая попытка использовать любой из этих конструкций приводит к исключению.

Примеры
/[[:digit:]]/            # Matches a character that is a digit.
/[01[:lower:]]/          # Matches a character that is either a
                         # lowercase letter, or '0' or '1'.
/[[:digit:][:^xdigit:]]/ # Matches a character that can be anything
                         # except the letters 'a' to 'f' and 'A' to
                         # 'F'.  This is because the main character
                         # class is composed of two POSIX character
                         # classes that are ORed together, one that
                         # matches any digit, and the other that
                         # matches anything that isn't a hex digit.
                         # The OR adds the digits, leaving only the
                         # letters 'a' to 'f' and 'A' to 'F' excluded.

Расширенные скобочные классы символов

Это расширенный скобочный класс символов, который может использоваться для более читабельных и менее подверженных ошибкам классов, а также для выполнения операций над множествами, таких как пересечение. Пример:

/(?[ \p{Thai} & \p{Digit} ])/

Это соответствует всем символам цифр, которые находятся в тайском шрифте.

Это экспериментальная функция, доступная, начиная с версии 5.18, и может быть изменена по мере накопления опыта в этой области. Любая попытка её использовать вызовет предупреждение, если не отключить её через

no warnings "experimental::regex_sets";

Комментарии к этой функции приветствуются; отправляйте письма по адресу perl5-porters@perl.org.

Правила, используемые use re 'strict, применяются к этой конструкции.

Мы можем расширить предыдущий пример:

/(?[ ( \p{Thai} + \p{Lao} ) & \p{Digit} ])/

Это соответствует цифрам, которые находятся в тайском или лаосском шрифтах.

Обратите внимание на пробелы в этих примерах. Эта конструкция всегда включает модификатор /xx в ней.

Доступные бинарные операторы:

&    intersection
+    union
|    another name for '+', hence means union
-    subtraction (the result matches the set consisting of those
     code points matched by the first operand, excluding any that
     are also matched by the second operand)
^    symmetric difference (the union minus the intersection).  This
     is like an exclusive or, in that the result is the set of code
     points that are matched by either, but not both, of the
     operands.

Есть один унарный оператор:

!    complement

Все бинарные операторы ассоциативны слева; "&" имеет более высокий приоритет, чем другие, которые имеют одинаковый приоритет. Унарный оператор ассоциативен справа и имеет самый высокий приоритет. Таким образом, это соответствует обычным правилам приоритета Perl для логических операторов. Используйте скобки, чтобы переопределить приоритет и ассоциативность по умолчанию.

Основное ограничение заключается в том, что всё является метасимволом. Поэтому вы не можете ссылаться на отдельные символы, выполняя действия вроде этого:

/(?[ a + b ])/ # Syntax error!

Самый простой способ указать отдельный набираемый символ — поместить его в квадратные скобки:

/(?[ [a] + [b] ])/

(Это то же самое, что и [ab].) Вы также могли бы сказать эквивалентное:

/(?[[ a b ]])/

(Конечно, вы можете указать отдельные символы, используя \x{...}, \N{...}, и т. д.)

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

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

Поскольку эта конструкция компилируется под use re 'strict, нераспознанные эскейпы, которые генерируют предупреждения в обычных классах, являются здесь фатальными ошибками, а также все другие предупреждения от этих элементов класса, а также некоторые практики, которые в настоящее время не выдают предупреждений вне re 'strict'. Например, вы не можете сказать

/(?[ [ \xF ] ])/     # Syntax error!

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

Если обычный скобочный класс символов содержит \p{} или \P{} и сопоставляется с кодом символа без Unicode, может быть выведено предупреждение, так как результат не определён в Unicode. При использовании этой расширенной формы такого предупреждения не будет.

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

/(?[ [\xDF] ])/iu

не соответствует строке ss.

Вам не нужно заключать имена POSIX-классов в двойные скобки, поэтому оба следующих варианта работают:

/(?[ [:word:] - [:lower:] ])/
/(?[ [[:word:]] - [[:lower:]] ])/

Любые содержащиеся POSIX-классы символов, включая такие вещи, как \w и \D, учитывают модификаторы /a (и /aa).

Обратите внимание, что (?[ ]) — это конструкция времени компиляции регулярных выражений. Любая попытка использовать то, что невозможно узнать на момент компиляции содержащего регулярного выражения, является фатальной ошибкой. На практике это означает всего три ограничения:

  1. При компиляции в рамках use locale (или модификатора регулярного выражения /l) этот конструкт предполагает, что локаль во время выполнения будет UTF-8, а сгенерированный шаблон всегда использует правила Юникода. Таким образом, соответствие или несоответствие не зависит от фактической локали во время выполнения, поэтому искажение не включено. Однако, если локаль во время выполнения окажется не UTF-8, будет выведено предупреждение категории locale.

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

  3. Регулярное выражение, которое в противном случае было бы скомпилировано с использованием /d правил и которое использует этот конструкт, вместо этого будет использовать /u. Таким образом, этот конструкт сообщает Perl, что вы не хотите /d правил для всего регулярного выражения, содержащего его.

Обратите внимание, что пропуск пробелов применяется только к внутренней части этого конструкта. Между любыми символами, образующими начальные (?[, не должно быть пробелов. Также не должно быть пробелов между закрывающими символами ]).

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

my $thai_or_lao = qr/(?[ \p{Thai} + \p{Lao} ])/;
my $lower = qr/(?[ \p{Lower} + \p{Digit} ])/;

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

my $thai_or_lao = '\p{Thai} + \p{Lao}';
...
qr/(?[ \p{Digit} & $thai_or_lao ])/;

компилируется в

qr/(?[ \p{Digit} & \p{Thai} + \p{Lao} ])/;

Но это не имеет того эффекта, которого, скорее всего, ожидает человек, читающий исходный код, поскольку пересечение применяется только к \p{Thai}, исключая лаосский. Лучше компилировать подкомпоненты, но вы также можете поместить компоненты в скобки:

my $thai_or_lao = '( \p{Thai} + \p{Lao} )';

Но любые модификаторы всё равно будут применяться ко всем компонентам:

my $lower = '\p{Lower} + \p{Digit}';
qr/(?[ \p{Greek} & $lower ])/i;

сопоставляет заглавные символы. Так что просто компилируйте подкомпоненты, как показано выше.

Из-за того, как Perl парсит вещи, вам, возможно, потребуется сбалансировать скобки и квадратные скобки, даже включая комментарии. Если вы столкнётесь с какими-либо примерами, пожалуйста, отправьте их на https://github.com/Perl/perl5/issues, чтобы у нас был конкретный пример для этой страницы справки.

Мы можем изменить это так, чтобы допустимые в обычных квадратных скобках символы могли стать недопустимыми в этом экспериментальном конструкте. Например, одним из предложений является запрет смежных использования одного и того же символа, как в (?[ [aa] ]). Мотивация такого изменения заключается в том, что такое использование, вероятно, является опечаткой, поскольку второй «a» ничего не добавляет.

© 1993–2021 Larry Wall and others
Licensed under the GNU General Public License version 1 or later, or the Artistic License.
The Perl logo is a trademark of the Perl Foundation.
https://perldoc.perl.org/5.34.0/perlrecharclass

Spec-Zone.ru

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