Это команда perlrecharclass, которую можно запустить в бесплатном хостинг-провайдере OnWorks, используя одну из наших многочисленных бесплатных онлайн-рабочих станций, таких как Ubuntu Online, Fedora Online, онлайн-эмулятор Windows или онлайн-эмулятор MAC OS.
ПРОГРАММА:
ИМЯ
perlrecharclass - классы символов регулярных выражений Perl
ОПИСАНИЕ
Документация верхнего уровня о регулярных выражениях Perl находится в perlre.
На этой странице руководства обсуждается синтаксис и использование классов символов в Perl.
выражения.
Класс символов - это способ обозначения набора символов таким образом, чтобы один
символ набора совпадает. Важно помнить, что соответствие символа
класс потребляет ровно один символ в исходной строке. (Исходная строка - это
строка, с которой сравнивается регулярное выражение.)
В регулярных выражениях Perl есть три типа классов символов: точка, обратная косая черта.
последовательности, а форма заключена в квадратные скобки. Однако имейте в виду, что часто
термин «класс символов» используется для обозначения только заключенной в квадратные скобки формы. Безусловно, большинство Perl
документация делает это.
" dot
Точка (или период), "." вероятно, самый используемый и, безусловно, самый известный
класс персонажа. По умолчанию точка соответствует любому символу, кроме символа новой строки. Что
по умолчанию можно изменить, чтобы добавить соответствующую новую строку, используя одинарной линия модификатор:
либо для всего регулярного выражения с модификатором «/ s», либо локально с «(? s)».
(Последовательность обратной косой черты "\ N", описанная ниже, соответствует любому символу, кроме новой строки
безотносительно к одинарной линия модификатор.)
Вот несколько примеров:
"а" = ~ /./ # Соответствие
"." = ~ /./ # Соответствие
"" = ~ /./ # Нет совпадений (точка должна соответствовать символу)
"\ n" = ~ /./ # Нет совпадений (точка не соответствует новой строке)
"\ n" = ~ /./s # Соответствие (глобальный модификатор 'однострочный')
"\ n" = ~ /(?s:.)/ # Соответствие (локальный модификатор 'однострочный')
"ab" = ~ /^.$/ # Нет совпадений (точка соответствует одному символу)
бэкслэш последовательности
Последовательность обратной косой черты - это последовательность символов, первый из которых является обратной косой чертой.
Perl придает особое значение многим таким последовательностям, и некоторые из них являются символьными.
классы. То есть каждый из них соответствует одному символу, при условии, что этот символ принадлежит
к конкретному набору символов, определяемому последовательностью.
Вот список последовательностей обратной косой черты, которые являются классами символов. Они обсуждаются
подробнее ниже. (Для последовательностей обратной косой черты, которые не являются классами символов, см.
perlобратная косая черта.)
\ d Соответствует десятичной цифре.
\ D Соответствует символу, не являющемуся десятичной цифрой.
\ w Соответствует символу "слова".
\ W Соответствует символу, не являющемуся словом.
\ s Соответствует пробельному символу.
\ S Соответствует непробельному символу.
\ h Соответствует горизонтальному пробельному символу.
\ H Соответствует символу, который не является горизонтальным пробелом.
\ v Соответствует вертикальному пробельному символу.
\ V Соответствует символу, который не является вертикальным пробелом.
\ N Соответствует символу, который не является новой строкой.
\ pP, \ p {Prop} Соответствует символу, имеющему данное свойство Unicode.
\ PP, \ P {Prop} Соответствует символу, не имеющему свойства Unicode.
\N
"\ N", доступный начиная с v5.12, как и точка, соответствует любому символу, кроме
новая линия. Разница в том, что "\ N" не зависит от одинарной линия регулярный
модификатор выражения (см. «Точка» выше). Обратите внимание, что форма "\ N {...}" может означать
что-то совсем другое. Когда "{...}" является квантификатором, это означает соответствие
не символ новой строки, что много раз. Например, «\ N {3}» означает соответствие 3 не-
новые строки; «\ N {5,}» означает соответствие 5 или более символам новой строки. Но если "{...}" не является законным
квантификатор, предполагается, что это именованный символ. См. Для них имена символов. Для
Например, ни один из "\ 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], но имеют разные значения.
Например, BENGALI DIGIT FOUR (U + 09EA) очень похож на ASCII DIGIT EIGHT.
(U + 0038). Приложение, которое ожидает только цифры ASCII, может быть введено в заблуждение, или если
совпадение - "\ d +", соответствующая строка может содержать смесь цифр из разных
системы письма, которые выглядят так, как будто они обозначают число, отличное от того, что есть на самом деле.
"число ()"в 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}", которое соответствует совершенно другому набору символов.
Эти символы представляют собой такие символы, как "ОБЪЕДИНЕННАЯ ЦИФРА ОДИН" или нижние индексы, или взяты из написания
системы, в которых отсутствуют все десять цифр.
По замыслу дизайнера "\ d" точно соответствует набору символов, которые можно безопасно
используется с "нормальным" позиционным десятичным синтаксисом с прямым порядком байтов, где, например, 123 означает единицу
«сотня», плюс две «десятки», плюс три «единицы». Это позиционное обозначение не
обязательно применяется к символам, которые соответствуют другому типу "цифры",
"\ p {Numeric_Type = Digit}", поэтому "\ d" им не соответствует.
Тамильские цифры (U + 0BE6 - U + 0BEF) также могут законно использоваться в старых тамильских номерах в
которые они будут появляться не более чем по одному в строке, разделенные символами, которые означают
«умножить на 10», «умножить на 100» и т. д. (см.http://www.unicode.org/notes/tn21>.)
Любой символ, которому не соответствует "\ d", соответствует "\ D".
Word символы
"\ W" соответствует одиночному буквенно-цифровому символу (буквенному символу или десятичному знаку).
цифра); или соединительный знак препинания, например подчеркивание ("_"); или "отметка"
характер (например, какой-то акцент), присущий одному из них. Это не соответствует
целое слово. Чтобы найти слово целиком, используйте «\ w +». Это не то же самое, что сопоставление
Английское слово, но в диапазоне ASCII это то же самое, что и строка Perl-идентификатора.
символы.
Если действует модификатор "/ a" ...
«\ w» соответствует 63 символам [a-zA-Z0-9_].
иначе ...
Для кодовых точек выше 255 ...
"\ w" совпадает с совпадением "\ p {Word}" в этом диапазоне. То есть совпадает
Тайские буквы, греческие буквы и т. Д. Сюда входит пунктуация соединителей (например,
подчеркивание), которые соединяют два слова вместе, или диакритические знаки, например "КОМБИНИРОВАНИЕ
ТИЛЬДА "и буквы-модификаторы, которые обычно используются для добавления вспомогательных
маркировка к буквам.
Для кодовых точек ниже 256 ...
если действуют правила локали ...
"\ w" соответствует собственному символу подчеркивания платформы плюс любые символы
языковой стандарт считается буквенно-цифровым.
если действуют правила Unicode ...
«\ w» точно соответствует тому, что соответствует «\ p {Word}».
иначе ...
«\ w» соответствует [a-zA-Z0-9_].
Какие правила применяются, определяется, как описано в разделе "Какой модификатор набора символов находится в
эффект? "на perlre.
Есть ряд проблем безопасности с полным списком символов слова Unicode. Видеть
<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]» ниже для обсуждения этого.) Обратите внимание, что в этом списке нет
включить неразрывный пробел.
Какие правила применяются, определяется, как описано в разделе "Какой модификатор набора символов находится в
эффект? "на perlre.
Любой символ, не совпадающий с "\ s", соответствует "\ S".
«\ h» соответствует любому символу, считающемуся горизонтальным пробелом; это включает платформу
символы пробела и табуляции и некоторые другие, перечисленные в таблице ниже. "\ H" соответствует любому
символ не считается горизонтальным пробелом. Они используют родной характер платформы
установить и не учитывать какие-либо языковые стандарты, которые могли бы использоваться в противном случае.
«\ v» соответствует любому символу, считающемуся вертикальным пробелом; это включает платформу
символы возврата каретки и перевода строки (новая строка) плюс несколько других символов, все
перечислены в таблице ниже. «\ V» соответствует любому символу, не считающемуся вертикальным пробелом.
Они используют собственный набор символов платформы и не учитывают языковой стандарт, который может
в противном случае использоваться.
«\ R» соответствует всему, что может считаться новой строкой по правилам Unicode. Он может соответствовать
многосимвольная последовательность. Его нельзя использовать внутри класса символов в квадратных скобках; используйте "\ v"
вместо этого (вертикальный пробел). Он использует собственный набор символов платформы и не
рассмотрите любые языковые стандарты, которые могут использоваться в противном случае. Подробности обсуждаются в
обратная косая черта.
Обратите внимание, что в отличие от «\ 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 ТАБЛИЦА ХАРАКТЕРА hs
0x000a ПОДАЧА ЛИНИИ (LF) или
0x000b ТАБЛИЦА СТРОК vs [1]
0x000c ПОДАЧА ФОРМЫ (FF) или
0x000d ВОЗВРАТ ПЕРЕВОЗКИ (CR) vs
0x0020 ПРОБЕЛ hs
0x0085 СЛЕДУЮЩАЯ СТРОКА (NEL) vs [2]
0x00a0 ПРОБЕЛ БЕЗ ПЕРЕРЫВА hs [2]
0x1680 OGHAM SPACE MARK hs
0x2000 EN QUAD hs
0x2001 EM QUAD hs
0x2002 EN SPACE hs
0x2003 EM SPACE hs
0x2004 ПРОСТРАНСТВО ТРИ НА ЭМ hs
0x2005 ПРОСТРАНСТВО ЧЕТЫРЕ НА ЭМ. Hs
0x2006 SIX-PER-EM SPACE hs
0x2007 ФИГУРКА ПРОБЕЛ hs
0x2008 ПРОБЕЛ ПУНКТУАЦИИ hs
0x2009 ТОНКОЕ ПРОСТРАНСТВО hs
0x200a ВОЛОСЫ hs
0x2028 СЕПАРАТОР ЛИНИИ vs
0x2029 РАЗДЕЛЕНИЕ ПАРАМЕТРОВ vs
0x202f УЗКИЙ ПРОБЕЛ, НЕПРЕРЫВНЫЙ, hs
0x205f СРЕДНЕЕ МАТЕМАТИЧЕСКОЕ ПРОСТРАНСТВО hs
0x3000 ИДЕОГРАФИЧЕСКОЕ ПРОСТРАНСТВО hs
[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}", что означает соответствие, если свойство "name" для
у персонажа есть эта особая «ценность». Например, совпадение числа может быть записано
как "/ \ pN /" или как "/ \ p {Number} /", или как "/ \ p {Number = True} /". Соответствуют строчные буквы
собственностью Строчная буква который имеет краткую форму Ll. Им нужны брекеты, как и
записывается как "/ \ p {Ll} /" или "/ \ p {Lowercase_Letter} /", или
"/ \ p {General_Category = Lowercase_Letter} /" (символы подчеркивания необязательны). "/ \ pLl /" - это
действительно, но означает другое. Соответствует двухсимвольной строке: букве
(Свойство Unicode "\ pL"), за которым следует строчная буква "l".
Если правила локали не действуют, использование свойства Unicode заставит
выражение на использование правил Unicode, если это еще не сделано.
Обратите внимание, что почти все свойства невосприимчивы к сопоставлению без учета регистра. То есть добавление
модификатор регулярного выражения "/ i" не меняет то, что им соответствует. Есть два набора
которые затронуты. Первый набор - «Прописные_буквы», «Строчные_буквы» и
«Titlecase_Letter», все из которых соответствуют «Cased_Letter» при сопоставлении «/ i». Второй набор
это «Прописные», «Строчные» и «Заголовки», все из которых соответствуют «В регистре» в «/ i»
соответствие. (Разница между этими наборами в том, что некоторые вещи, например римские цифры,
вводятся как в верхнем, так и в нижнем регистре, поэтому они имеют регистр, но не считаются
буквы, поэтому они не "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} # Ошибка на Perls <v5.20.
CHR(0x110000) = ~ \ p {ASCII_Hex_Digit = False} # Также не работает на Perls
# <v5.20
Несмотря на то, что эти два матча можно было рассматривать как дополнения, до версии 5.20 они были такими
только в кодовых точках Unicode.
Примеры
"a" = ~ / \ w / # Соответствует, "a" - это символ слова.
"7" = ~ / \ w / # Соответствует, "7" также является символом "слова".
"a" = ~ / \ d / # Нет совпадений, "a" не является цифрой.
"7" = ~ / \ d / # Соответствует, "7" - это цифра.
"" = ~ / \ s / # Соответствует, пробел - это пробел.
"a" = ~ / \ D / # Соответствует, "a" не является цифрой.
"7" = ~ / \ D / # Нет совпадений, "7" не является цифрой.
"" = ~ / \ S / # Нет совпадений, пробел не является пробелом.
"" = ~ / \ h / # Соответствует, пробел - это горизонтальный пробел.
"" = ~ / \ v / # Нет совпадений, пробел не является вертикальным пробелом.
"\ r" = ~ / \ v / # Соответствует, возврат - вертикальный пробел.
"a" = ~ / \ pL / # Соответствует, "a" - буква.
"a" = ~ / \ p {Lu} / # Нет совпадений, / \ p {Lu} / соответствует заглавным буквам.
"\ x {0e0b}" = ~ / \ p {Thai} / # Соответствует, \ x {0e0b} - это символ
# 'THAI CHARACTER SO SO', и это в
# Тайский класс Unicode.
"a" = ~ / \ P {Lao} / # Соответствует, поскольку "a" не является лаосским иероглифом.
Следует подчеркнуть, что "\ d", "\ w" и т. Д. Соответствуют одиночным символам, а не полному
числа или слова. Чтобы сопоставить число (состоящее из цифр), используйте «\ d +»; соответствовать слову,
используйте "\ w +". Но помните о соображениях безопасности при этом, как упоминалось выше.
В скобках Характер Классы
Третья форма класса символов, которую вы можете использовать в регулярных выражениях Perl, - это скобки
класс персонажа. В простейшей форме он перечисляет символы, которые могут быть сопоставлены,
в квадратных скобках, например: «[aeiou]». Соответствует одному из "a", "e", "i",
«о» или «и». Подобно другим классам символов, сопоставляется ровно один символ. * Для сопоставления
более длинная строка, состоящая из символов, упомянутых в классе символов, после
класс символов с квантификатором. Например, "[aeiou] +" соответствует одному или нескольким строчным буквам.
Английские гласные.
Повторение символа в классе символов не имеет никакого эффекта; это считается в комплекте
только один раз.
Примеры:
"e" = ~ / [aeiou] / # Соответствует, поскольку "e" указано в классе.
"p" = ~ / [aeiou] / # Нет совпадений, "p" не указана в классе.
"ae" = ~ / ^ [aeiou] $ / # Нет совпадений, соответствует только класс символов
# одиночный символ.
"ae" = ~ / ^ [aeiou] + $ / # Соответствует квантификатору.
-------
* Есть два исключения из класса символов в квадратных скобках, соответствующего одному символу.
Только. Для каждого из них требуется особая обработка со стороны Perl:
· Когда класс должен соответствовать без учета регистра в соответствии с правилами сопоставления "/ i", и символ, который
явно упоминается внутри класса, соответствует многосимвольной последовательности
без учета регистра по правилам Unicode класс также будет соответствовать этой последовательности. Например,
Unicode говорит, что буква «LATIN SMALL LETTER SHARP S» должна соответствовать последовательности
"ss" по правилам "/ i". Таким образом,
'ss' = ~ / \ A \ N {СТРОЧНАЯ ЛАТИНСКАЯ БУКВА, SHARP S} \ z / i # Соответствует
'ss' = ~ / \ A [aeioust \ N {ЛАТИНСКАЯ СТРОЧНАЯ БУКВА S}] \ z / i # Соответствует
Чтобы это произошло, класс не должен быть инвертирован (см. «Отрицание»), а символ
должны быть явно указаны и не должны быть частью многосимвольного диапазона (даже если
одна из его конечных точек). («Диапазоны символов» будут объяснены в ближайшее время.) Следовательно,
'ss' = ~ / \ A [\ 0- \ x {ff}] \ z / ui # Не соответствует
'ss' = ~ / \ A [\ 0- \ N {СТРОЧНАЯ ЛАТИНСКАЯ БУКВА S}] \ z / ui # Нет совпадений
'ss' = ~ / \ A [\ xDF- \ xDF] \ z / ui # Соответствует платформам ASCII, поскольку
# \ xDF - СТРОЧНАЯ ЛАТИНСКАЯ БУКВА, ОСТРЫЙ S,
# а диапазон - всего лишь один
# элемент
Обратите внимание, что в любом случае указывать эти типы диапазонов не рекомендуется.
· Некоторые имена, известные как "\ N {...}", относятся к последовательности из нескольких символов, а не к
обычный одиночный персонаж. Когда один из них включен в класс, весь
последовательность совпадает. Например,
"\ N {ТАМИЛЬСКАЯ БУКВА KA} \ N {ТАМИЛЬСКИЙ ГЛАВНЫЙ ЗНАК AU}"
= ~ / ^ [\ N {ТАМИЛЬСКИЙ СЛОВО КАУ}] $ / x;
совпадает, потому что "\ N {TAMIL SYLLABLE KAU}" - это именованная последовательность, состоящая из двух
сопоставленные символы. Как и в другом случае, когда класс в квадратных скобках может соответствовать
несколько символов, и по схожим причинам класс нельзя инвертировать, а
Именованная последовательность может не появляться в диапазоне, даже если это обе конечные точки. Если
такое случается, это фатальная ошибка, если класс символов находится в расширенном
"(?[...])" класс; и используется только первая кодовая точка (с предупреждением типа "регулярное выражение"
поднял) в противном случае.
Особый Персонажи внутри a В скобках Характер Класс
Большинство символов, которые являются метасимволами в регулярных выражениях (т. Е. Символы,
несут особое значение, например ".", "*" или "("), теряют свое особое значение и могут использоваться
внутри класса символов без необходимости их экранирования. Например, «[()]» соответствует
открывающая или закрывающая круглые скобки и скобки внутри
класс персонажей не группируется и не захватывается.
Символы, которые могут иметь особое значение внутри класса символов: «\», «^», «-»,
«[» и «]», и обсуждаются ниже. Их можно экранировать с помощью обратной косой черты, хотя это
иногда не требуется, и в этом случае обратная косая черта может быть опущена.
Последовательность «\ b» является особенной внутри класса символов в квадратных скобках. В то время как за пределами
класс символов, "\ b" - это утверждение, указывающее на точку, в которой нет ни одного из двух
символы слова или два символа без слова с обеих сторон внутри символа в квадратных скобках
class, "\ b" соответствует символу возврата.
Последовательности "\ a", "\ c", "\ e", "\ f", "\ n", "\ N {ИМЯ}", "\ N {U +шестнадцатеричный char} ", «\ r», «\ t» и
"\ x" также являются особыми и имеют то же значение, что и вне скобок.
класса.
Кроме того, восьмеричным числом считается обратная косая черта, за которой следуют две или три восьмеричных цифры.
Знак "[" не является специальным внутри класса символов, если он не является началом символа POSIX.
class (см. «Классы символов POSIX» ниже). Обычно это не требует побега.
"]" Обычно является концом класса символов POSIX (см. "Классы символов POSIX"
ниже), или сигнализирует об окончании класса символов в квадратных скобках. Если вы хотите включить
"]" в наборе символов, как правило, вы должны избегать его.
Однако, если "]" является первый (или второй, если первый символ - каретка)
символ класса символов в квадратных скобках, он не обозначает конец класса (как вы
не может иметь пустой класс) и считается частью набора символов, которые могут быть
совпадают без побега.
Примеры:
"+" = ~ / [+? *] / # Соответствие "+" в классе символов не является особенным.
"\ cH" = ~ / [\ b] / # Соответствие, \ b внутри класса символов
# эквивалентен пробелу.
"]" = ~ / [] [] / # Соответствует, поскольку класс символов содержит
# оба и ].
"[]" = ~ / [[]] / # Соответствует, шаблон содержит класс символов
# содержащий только [, а класс символов -
#, за которым следует].
Характер Диапазоны
Нередко возникает желание сопоставить диапазон символов. К счастью, вместо того, чтобы перечислять все
символов в диапазоне можно использовать дефис («-»). Если внутри символа в квадратных скобках
class у вас есть два символа, разделенных дефисом, он обрабатывается так, как если бы все символы
между двумя были в классе. Например, «[0-9]» соответствует любой цифре ASCII, а
«[am]» соответствует любой строчной букве из первой половины алфавита ASCII.
Обратите внимание, что два символа по обе стороны от дефиса не обязательно являются обеими буквами.
или обе цифры. Возможен любой персонаж, но не рекомендуется. "['-?]" содержит
диапазон символов, но большинство людей не знают, какие символы это означает.
Кроме того, такие диапазоны могут привести к проблемам с переносимостью, если код должен выполняться на
платформа, использующая другой набор символов, например EBCDIC.
Если дефис в классе символов синтаксически не может быть частью диапазона, например
потому что это первый или последний символ класса символов, или если он сразу
следует за диапазоном, дефис не является особенным и считается символом, который нужно сопоставить
буквально. Если вы хотите, чтобы дефис в вашем наборе символов соответствовал и его положение
в классе такова, что его можно рассматривать как часть диапазона, вы должны избегать этого
дефис с обратной косой чертой.
Примеры:
[az] # Соответствует символу, который является строчной буквой ASCII.
[a-fz] # Соответствует любой букве от "a" до "f" (включительно) или
# буква "z".
[-z] # Соответствует либо дефису ('-'), либо букве 'z'.
[afm] # Соответствует любой букве между 'a' и 'f' (включительно),
# дефис ('-') или буква 'м'.
['-?] # Соответствует любому из символов' () * +, -. / 0123456789:; <=>?
# (Но не на платформе EBCDIC).
[\ N {АПОСТРОФ} - \ N {ВОПРОСНИК}]
# Соответствует любому из символов '() * +, -. / 0123456789:; <=>?
# даже на платформе EBCDIC.
[\ N {U + 27} - \ N {U + 3F}] # То же. (U + 27 - "'", а U + 3F - "?")
Как показывают два последних примера выше, вы можете достичь переносимости на не-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. Предупреждение о "регулярном выражении"
возникает в разделе «use re 'strict'», если другая конечная точка указана непереносимо:
[\ N {U + 00} - \ x09] # Предупреждение при 'строгом'; \ x09 не переносится
[\ N {U + 00} - \ t] # Нет предупреждения;
Оба приведенных выше символа соответствуют символам "\ N {U + 00}" "\ N {U + 01}", ... "\ N {U + 08}", "\ N {U + 09}",
но "\ x09" выглядит так, как будто это ошибка, поэтому появляется предупреждение (в разделе "re
'строгий' ") за это.
Perl также гарантирует, что диапазоны «AZ», «az», «0–9» и любые поддиапазоны этих значений соответствуют
то, что говорящий только по-английски мог бы ожидать от них на любой платформе. То есть "[А-Я]"
соответствует 26 заглавным буквам ASCII; «[az]» соответствует 26 строчным буквам; а также
«[0-9]» соответствует 10 цифрам. Поддиапазоны, такие как "[hk]", соответствуют соответственно в этом
введите только четыре буквы «h», «i», «j» и «k». Это естественное поведение в ASCII
платформы, на которых кодовые точки (порядковые номера) от "h" до "k" являются последовательными
целые числа (от 0x68 до 0x6B). Но для этого может потребоваться специальное обращение.
платформы с собственным набором символов, отличным от ASCII. Например, на платформах EBCDIC
кодовая точка для «h» - 0x88, «i» - 0x89, «j» - 0x91, «k» - 0x92. Perl специально
обрабатывает "[hk]", чтобы исключить семь кодовых точек в промежутке: от 0x8A до 0x90. Этот
специальная обработка вызывается только тогда, когда диапазон является поддиапазоном одного из ASCII
прописные, строчные и цифровые диапазоны, И каждый конец диапазона выражается как
литерал, например "A", или именованный символ ("\ N {...}", включая форму "\ N {U + ...").
Примеры EBCDIC:
[ij] # Соответствует "i" или "j"
[i- \ N {СТРОЧНАЯ ЛАТИНСКАЯ БУКВА J}] # То же
[i- \ N {U + 6A}] # То же
[\ N {U + 69} - \ N {U + 6A}] # То же
[\ x {89} - \ x {91}] # Соответствует 0x89 ("i"), 0x8A .. 0x90, 0x91 ("j")
[i- \ x {91}] # То же
[\ x {89} -j] # То же
[iJ] # Соответствует, 0x89 ("i") .. 0xC1 ("J"); особый
# обработка не применяется, потому что диапазон смешанный
# кейс
отрицание
Также можно вместо этого перечислить символы, которым вы не хотите соответствовать. Вы можете это сделать
с помощью символа вставки («^») в качестве первого символа в классе символов. Например,
«[^ az]» соответствует любому символу, не являющемуся строчной буквой ASCII, поэтому
включает более миллиона кодовых точек Unicode. Класс называется "отрицаемым" или
"перевернутый".
Этот синтаксис делает каретку специальным символом внутри класса символов в квадратных скобках, но
только если это первый символ класса. Итак, если вы хотите, чтобы курсор был одним из
символы для сопоставления, либо избегайте каретки, либо не перечисляйте их первыми.
В классах символов в перевернутых скобках Perl игнорирует правила Unicode, которые обычно говорят
эта названная последовательность, а определенные символы должны соответствовать последовательности из нескольких символов
использовать при сопоставлении "/ i" без регистра. Следование этим правилам может привести к путанице.
ситуации:
«сс» = ~ / ^ [^ \ xDF] + $ / ui; # Матчи!
Это должно соответствовать любым последовательностям символов, которые не соответствуют "\ xDF" и тем, что соответствует "\ xDF"
под "/ i". "s" не является "\ xDF", но Unicode говорит, что "ss" - это то, что "\ xDF" соответствует под
"/я". Так кто же «побеждает»? Вы не соответствуете, потому что в строке есть "ss", или принимаете его
потому что за ним стоит буква «s»? Perl выбрал последнее. (См. Примечание в
«Классы символов в квадратных скобках» выше.)
Примеры:
"e" = ~ / [^ aeiou] / # Нет совпадений, отображается буква "e".
"x" = ~ / [^ aeiou] / # Соответствует, поскольку 'x' не является гласным в нижнем регистре.
"^" = ~ / [^^] / # Нет совпадений, соответствует всему, что не является символом курсора.
"^" = ~ / [x ^] / # Соответствие, каретка здесь не особенная.
бэкслэш Последовательности
Вы можете поместить любой класс символов последовательности обратной косой черты (за исключением "\ N" и "\ R")
внутри класса символов в квадратных скобках, и он будет действовать так же, как если бы вы поместили все символы
соответствует последовательности обратной косой черты внутри класса символов. Например, «[af \ d]»
соответствует любой десятичной цифре или любой строчной букве от «a» до «f» включительно.
"\ N" в классе символов в квадратных скобках должно иметь форму "\ N {имя}" или "\ N {U +шестнадцатеричный
char} ", и НЕ быть формой, которая соответствует не символам новой строки, по той же причине, что и точка "."
внутри класса символов в квадратных скобках теряет свое особое значение: он соответствует почти всему,
что обычно не то, что вы хотите.
Примеры:
/ [\ p {Thai} \ d] / # Соответствует символу тайского
# символ или цифра.
/ [^ \ p {Arabic} ()] / # Соответствует символу, который не является арабским.
# символ, ни скобки.
Классы символов последовательности обратной косой черты не могут образовывать одну из конечных точек диапазона. Таким образом,
ты не можешь сказать:
/ [\ p {Thai} - \ d] / # Неправильно!
POSIX Характер Классы
Классы символов POSIX имеют вид «[: class:]», где класс это имя, а "[:"
и разделители ":]". Отображаются только классы символов POSIX внутри заключенный в скобки символ
классы и представляют собой удобный и наглядный способ перечисления группы символов.
Будьте осторожны с синтаксисом,
# Верный:
$ string = ~ / [[: alpha:]] /
# Неправильно (предупредит):
$ string = ~ / [: alpha:] /
Последний шаблон будет классом символов, состоящим из двоеточия и букв «а»,
«л», «п» и «з».
Классы символов POSIX могут быть частью более крупного класса символов в квадратных скобках. Например,
[01 [: альфа:]%]
является допустимым и соответствует '0', '1', любому алфавитному символу и знаку процента.
Perl распознает следующие классы символов POSIX:
alpha Любой алфавитный символ («[A-Za-z]»).
alnum Любой буквенно-цифровой символ ("[A-Za-z0-9]").
ascii Любой символ в наборе символов ASCII.
blank Расширение GNU, равное пробелу или горизонтальной табуляции ("\ t").
cntrl Любой управляющий символ. См. Примечание [2] ниже.
цифра Любая десятичная цифра («[0-9]»), эквивалентная «\ d».
график Любой печатный символ, кроме пробела. См. Примечание [3] ниже.
lower Любой символ нижнего регистра ("[az]").
print Любой печатный символ, включая пробел. См. Примечание [4] ниже.
punct Любой графический символ, за исключением символов «слова». Примечание [5].
пробел Любой пробел. "\ s", включая вертикальную табуляцию
("\ cK").
верхний Любой символ верхнего регистра ("[AZ]").
word Расширение Perl ("[A-Za-z0-9_]"), эквивалентное "\ w".
xdigit Любая шестнадцатеричная цифра ("[0-9a-fA-F]").
Как и свойства Unicode, большинство свойств POSIX совпадают независимо от
действует ли совпадение без учета регистра ("/ i") или нет. Два исключения:
"[:верхний и нижний:]". В разделе "/ i" каждый из них соответствует объединению "[: upper:]" и
"[:ниже:]".
Большинство классов символов POSIX имеют два аналога свойства "\ p" в стиле Unicode. (Они есть
не официальные свойства Unicode, а расширения Perl, производные от официального Unicode
свойства.) В таблице ниже показана связь между символьными классами POSIX и этими
двойники.
Один аналог в столбце таблицы с надписью "ASCII-range Unicode" соответствует только
символы в наборе символов ASCII.
Другой аналог в столбце "Full-range Unicode" соответствует любому
соответствующие символы в полном наборе символов Unicode. Например, "\ p {Alpha}"
соответствует не только алфавитным символам ASCII, но и любому символу во всем Unicode
набор символов считается буквенным. Запись в столбце "последовательность обратной косой черты"
является (коротким) эквивалентом.
[[: ...:]] ASCII-диапазон Полный обратный слеш Примечание
Юникод Последовательность Юникода
-------------------------------------------------- ---
альфа \ p {PosixAlpha} \ p {XPosixAlpha}
alnum \ p {PosixAlnum} \ p {XPosixAlnum}
ascii \ p {ASCII}
пусто \ p {PosixBlank} \ p {XPosixBlank} \ h [1]
или \ p {HorizSpace} [1]
cntrl \ p {PosixCntrl} \ p {XPosixCntrl} [2]
цифра \ p {PosixDigit} \ p {XPosixDigit} \ d
граф \ p {PosixGraph} \ p {XPosixGraph} [3]
нижний \ p {PosixLower} \ p {XPosixLower}
печать \ p {PosixPrint} \ p {XPosixPrint} [4]
punct \ p {PosixPunct} \ p {XPosixPunct} [5]
\ p {PerlSpace} \ p {XPerlSpace} \ s [6]
пробел \ p {PosixSpace} \ p {XPosixSpace} [6]
верхний \ p {PosixUpper} \ p {XPosixUpper}
слово \ p {PosixWord} \ p {XPosixWord} \ w
xdigit \ p {PosixXDigit} \ p {XPosixXDigit}
[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}" и (по правилам Юникода) "[[: 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.
Помимо названий, перечисленных в таблице, можно использовать и другие синонимы.
Например, «\ p {PosixAlpha}» можно записать как «\ p {Alpha}». Все перечислены в
"Свойства, доступные через \ p {} и \ P {}" в perluniprops.
Оба экземпляра "\ p" всегда предполагают, что действуют правила Unicode. На платформах ASCII,
это означает, что они предполагают, что кодовые точки от 128 до 255 являются Latin-1, а это означает
что использовать их в соответствии с правилами локали неразумно, если не гарантируется, что локаль будет Latin-1
или UTF-8. Напротив, классы символов POSIX полезны в соответствии с правилами локали. Они
на них влияют действующие правила, а именно:
Если действует модификатор "/ a" ...
Каждый из классов POSIX соответствует точно так же, как их аналоги в диапазоне ASCII.
иначе ...
Для кодовых точек выше 255 ...
Класс POSIX совпадает с его полнофункциональным аналогом.
Для кодовых точек ниже 256 ...
если действуют правила локали ...
Класс POSIX соответствует языку, за исключением:
"слово"
также включает собственный символ подчеркивания платформы, независимо от того, что
локаль есть.
"ascii"
на платформах, не имеющих расширения POSIX "ascii", это соответствует
только собственные символы диапазона ASCII платформы.
"пустой"
на платформах, которые не имеют "пустого" расширения POSIX, это соответствует
только собственные табуляции и пробелы платформы.
если действуют правила Unicode ...
Класс POSIX совпадает с полнодиапазонным аналогом.
иначе ...
Класс POSIX совпадает с аналогом диапазона ASCII.
Какие правила применяются, определяется, как описано в разделе "Какой модификатор набора символов находится в
эффект? "на perlre.
Предлагается изменить это поведение в будущих версиях Perl, чтобы независимо от того,
Действующие правила Unicode не повлияют на поведение: за пределами локали POSIX
классы будут вести себя как их аналоги в диапазоне ASCII. Если вы хотите прокомментировать это
предложение, отправьте электронное письмо на адрес "[электронная почта защищена]".
Отрицание классов символов POSIX
Расширение Perl для символьного класса POSIX - это возможность отрицать его. Это делается
префикс имени класса с помощью символа вставки ("^"). Некоторые примеры:
POSIX ASCII-диапазон Полный обратный слеш
Юникод Последовательность Юникода
-------------------------------------------------- ---
[[: ^ цифра:]] \ P {PosixDigit} \ P {XPosixDigit} \ D
[[: ^ пробел:]] \ P {PosixSpace} \ P {XPosixSpace}
\ P {PerlSpace} \ P {XPerlSpace} \ S
[[: ^ слово:]] \ P {PerlWord} \ P {XPosixWord} \ W
Последовательность обратной косой черты может означать либо ASCII-, либо Full-range Unicode, в зависимости от различных
факторы, как описано в разделе «Какой модификатор набора символов действует?» в perlre.
[= =] и [. .]
Perl распознает классы символов POSIX "[= class =]" и "[.class.]", Но не
(пока?) поддержите их. Любая попытка использовать любую конструкцию вызывает исключение.
Примеры
/ [[: digit:]] / # Соответствует символу, который является цифрой.
/ [01 [: lower:]] / # Соответствует символу, который является
# строчная буква, либо «0», либо «1».
/ [[: digit:] [: ^ xdigit:]] / # Соответствует символу, который может быть любым
# кроме букв от 'a' до 'f' и 'A' до
# 'F'. Это потому, что главный герой
# класс состоит из двух символов POSIX
# классов, объединенных по ИЛИ, один из которых
# соответствует любой цифре, а другой, который
# соответствует чему-либо, кроме шестнадцатеричной цифры.
# ИЛИ складывает цифры, оставляя только
# буквы от «a» до «f» и от «A» до «F» исключены.
Расширенный пакет В скобках Характер Классы
Это причудливый класс символов в квадратных скобках, который можно использовать для большей читабельности и меньшего
подверженные ошибкам классы и для выполнения заданных операций, таких как пересечение. Примером является
/ (? [\ p {тайский} & \ p {Digit}]) /
Это будет соответствовать всем цифровым символам в тайском сценарии.
Это экспериментальная функция, доступная начиная с версии 5.18, и она может быть изменена по мере того, как мы
получить полевой опыт с ним. Любая попытка его использования вызовет предупреждение, если только
отключен через
нет предупреждений "экспериментальный :: regex_sets";
Комментарии по этой функции приветствуются; отправить электронное письмо по адресу "[электронная почта защищена]".
Мы можем расширить приведенный выше пример:
/ (? [(\ p {тайский} + \ p {лаосский}) & \ p {Digit}]) /
Это соответствует цифрам в тайском или лаосском алфавите.
Обратите внимание на пробелы в этих примерах. Эта конструкция всегда имеет модификатор "/ x"
включился внутри него.
Доступные бинарные операторы:
& пересечение
+ союз
| другое название для '+', следовательно, означает союз
- вычитание (результат соответствует набору, состоящему из
кодовые точки, совпадающие с первым операндом, за исключением тех, которые
также соответствуют второму операнду)
^ симметричная разность (объединение минус пересечение). Этот
похож на исключающее или в том смысле, что результатом является набор кода
точки, совпадающие с одним, но не обоими
операнды.
Есть один унарный оператор:
! дополнять
Все бинарные операторы слева ассоциируются; "&" имеет более высокий приоритет, чем другие, которые
все имеют равный приоритет. Унарный оператор связывает справа и имеет наивысший
приоритет. Таким образом, это следует обычным правилам приоритета Perl для логических операторов.
Используйте круглые скобки, чтобы переопределить приоритет и ассоциативность по умолчанию.
Главное ограничение - все является метасимволом. Таким образом, вы не можете ссылаться на
одиночных символов, выполнив что-то вроде этого:
/ (? [a + b]) / # Синтаксическая ошибка!
Самый простой способ указать отдельный типизированный символ - заключить его в квадратные скобки:
/ (? [[a] + [b]]) /
(Это то же самое, что и «[ab]».) Вы также могли бы сказать эквивалент:
/ (? [[ab]]) /
(Вы, конечно, можете указать отдельные символы, используя "\ x {...}", "\ N {...}" и т. Д.)
В этом последнем примере показано использование этой конструкции для указания обычного заключенного в квадратные скобки
класс символов без дополнительных операций над множеством. Обратите внимание на пустое пространство внутри него; "/Икс"
включен даже в классах символов в квадратных скобках, за исключением того, что у вас не может быть комментариев
внутри них. Следовательно,
(? [[#]])
соответствует буквальному символу "#". Чтобы указать буквальный символ пробела, вы можете
экранируйте его с помощью обратной косой черты, например:
/ (? [[aeiou \]]) /
Это соответствует английским гласным плюс символу ПРОБЕЛ. Все остальные побеги приняты
здесь также принимаются классы обычных символов в квадратных скобках; но неопознанные побеги
которые генерируют предупреждения в обычных классах, здесь являются фатальными ошибками.
Все предупреждения от этих элементов класса фатальны, как и некоторые действия, которые не
на данный момент предупреждаю. Например, вы не можете сказать
/ (? [[\ xF]]) / # Синтаксическая ошибка!
У вас должны быть две шестнадцатеричные цифры после символа «\ x» без скобок (чтобы получить два, используйте начальный ноль).
Эти ограничения призваны снизить количество опечаток, из-за которых класс не соответствует тому, что
вы думали, что так и будет.
Если обычный класс символов в квадратных скобках содержит "\ p {}" или "\ P {}" и сравнивается с
кодовая точка, отличная от Unicode, может появиться предупреждение, поскольку результат не определен Unicode.
При использовании этой расширенной формы такого предупреждения не будет.
Последнее различие между обычными классами символов в квадратных скобках и этими классами состоит в том, что это
Невозможно заставить их соответствовать многосимвольному сгибу. Таким образом,
/ (? [[\ xDF]]) / iu
не соответствует строке «ss».
Вам не нужно заключать имена классов POSIX в двойные скобки, поэтому оба
следующие работы:
/ (? [[: word:] - [: lower:]]) /
/ (? [[[: word:]] - [[: lower:]]]) /
Любые содержащиеся классы символов POSIX, включая такие вещи, как «\ w» и «\ D», соблюдают
Модификаторы "/ a" (и "/ aa").
"(? [])" - это конструкция во время компиляции регулярного выражения. Любая попытка использовать что-то, что не
знать во время компиляции содержащего регулярного выражения является фатальной ошибкой. В
На практике это означает всего три ограничения:
1. Эту конструкцию нельзя использовать в рамках "use locale" (или регулярного выражения "/ l"
модификатор).
2. Любое используемое пользователем свойство должно быть уже определено к моменту регулярного
выражение компилируется (но учтите, что эту конструкцию можно использовать вместо таких
свойства).
3. Регулярное выражение, которое в противном случае компилируется с использованием правил "/ d" и которое использует
эта конструкция вместо этого будет использовать "/ u". Таким образом, эта конструкция сообщает Perl, что вы не
хотите правила "/ d" для всего содержащего его регулярного выражения.
Обратите внимание, что пропуск пустого пространства применяется только к внутренней части этой конструкции. Должен
не должно быть пробелов между символами, образующими начальный "(? [". Также не может быть
быть пробелом между закрывающими символами "])".
Как и во всех регулярных выражениях, шаблон можно создать, включив переменные
которые интерполируются во время компиляции регулярного выражения. Необходимо позаботиться о том, чтобы вы
получаете то, что ожидаете. Например:
мой $ thai_or_lao = '\ p {тайский} + \ p {лаосский}';
...
qr / (? [\ p {Digit} & $ thai_or_lao]) /;
компилируется в
qr / (? [\ p {Digit} & \ p {тайский} + \ p {лаосский}]) /;
Но это не дает того эффекта, который мог бы ожидать кто-то, читающий код, поскольку
пересечение относится только к "\ p {Thai}", за исключением лаосского. Такие ловушки
можно избежать, заключив в скобки компоненты:
мой $ thai_or_lao = '(\ p {тайский} + \ p {лаосский})';
Но любые модификаторы по-прежнему будут применяться ко всем компонентам:
мой $ lower = '\ p {Lower} + \ p {Digit}';
qr / (? [\ p {греческий} & $ lower]) / i;
соответствует прописным буквам. Вы можете избежать сюрпризов, превратив компоненты в
экземпляры этой конструкции путем их компиляции:
мой $ thai_or_lao = qr / (? [\ p {тайский} + \ p {лаосский}]) /;
мой $ lower = qr / (? [\ p {Lower} + \ p {Digit}]) /;
Когда они встроены в другой шаблон, то, что они соответствуют, не меняется, независимо от
круглые скобки или какие модификаторы действуют во внешнем шаблоне.
Из-за того, как Perl разбирает вещи, ваши круглые и квадратные скобки могут быть
сбалансировано, даже включая комментарии. Если вы столкнетесь с какими-либо примерами, отправьте их по адресу
"[электронная почта защищена]", чтобы у нас был конкретный пример для этой страницы руководства.
Мы можем изменить его так, чтобы вещи, которые остаются законными, использовались в обычных скобках.
классы могут стать незаконными в рамках этой экспериментальной конструкции. Одно предложение для
Например, это запретить соседнее использование одного и того же символа, как в «(? [[aa]])». В
мотивация для такого изменения заключается в том, что это использование, вероятно, является опечаткой, поскольку второе «а» добавляет
ничего.
Используйте perlrecharclass онлайн с помощью сервисов onworks.net