Spec-Zone.ru › Perl 5.30

perlrecharclass

СОДЕРЖАНИЕ

  • ИМЯ
  • ОПИСАНИЕ
    • Точка
    • Последовательности с обратной косой чертой
      • \N
      • Цифры
      • Символы слова
      • Пробелы
      • Свойства Unicode
        • Примеры
    • Символьные классы в квадратных скобках
      • Специальные символы внутри символьного класса в квадратных скобках
      • Символьные классы в квадратных скобках и модификатор шаблона /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) очень похожа на АСКИЙ ЦИФРУ ВОСЕМЬ (U+0038), а ЛЕПЧА ЦИФРА ШЕСТЬ (U+1C46) очень похожа на АСКИЙ ЦИФРУ ПЯТЬ (U+0035). Приложение, которое ожидает только ASCII-цифры, может быть введено в заблуждение, или если сопоставление является \d+, сопоставленная строка может содержать смесь цифр из разных систем письма, которые выглядят так, как будто они обозначают число, отличное от фактического. "num()" в Unicode::UCD может использоваться для безопасного вычисления значения, возвращая undef если входная строка содержит такую смесь. В противном случае, например, отображаемая цена может быть намеренно другой, чем кажется.

То, что означает \p{Digit} (и, следовательно, \d за исключением модификатора /a) — это \p{General_Category=Decimal_Number}, или, синонимично, \p{General_Category=Digit}. Начиная с версии Unicode 4.1, это тот же набор символов, сопоставляемых \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» и т. д. (См. http://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 сопоставляет системное подчеркивание платформы плюс любые буквенно-цифровые символы, которые язык определяет как буквенно-цифровые.

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

\w сопоставляет точно то же, что и \p{Word}.

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

\w сопоставляет [a-zA-Z0-9_].

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

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

Также, для более детализированного набора символов, которые присутствуют в идентификаторах языков программирования за пределами диапазона ASCII, вы можете использовать более настраиваемые "Свойства Unicode", \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]

Следующая строка и НЕРАЗРЫВНЫЙ ПРОБЕЛ могут или могут не соответствовать \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_Letter. На самом деле они Letter_Number.) Этот набор также включает свои подмножества PosixUpper и PosixLower, оба из которых при сопоставлении без учета регистра /i соответствуют PosixAlpha.

Для получения дополнительной информации о свойствах Unicode см. "Свойства символов Unicode" в perlunicode; для получения полного списка возможных свойств см. "Свойства, доступные через \p{} и \P{}" в perluniprops, который отмечает все формы, имеющие /i различия. Также возможно определить свои собственные свойства. Это обсуждается в "Пользовательские свойства символов" в perlunicode.

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

До версии 5.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

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

Начиная с perl v5.30, в значениях свойств Unicode разрешены подстановочные знаки. См. "Подстановочные знаки в значениях свойств" в 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: 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–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.30.3/perlrecharclass

Spec-Zone.ru

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