Точка и инвертированные символьные классы
При работе с программами, допускающими поиск в многострочном тексте, следует помнить, что точка обычно не совпадает с символом новой строки, но инвертированные классы типа r[~"]j обычно с этим символом совпадают. Таким образом, переход от ". * к " [ ^" ] *" может преподнести сюрприз.
3. Сокращенные обозначения классов: \w, \d, \s, \W, \D, \S
В большинстве программ существуют следующие удобные сокращения для конструкций, которые обычно оформляются в виде класса:
\d Цифра.Обычно эквивалентно [0-9] или в некоторых программах с поддержкой Юникода - любым цифрам Юникода.
\D He-цифра.Обычно эквивалентно [ ^\d ].
\w Символ, входящий в слово.Часто эквивалентно [a-zA-Z0-9_], хотя одни программы исключают символ подчеркивания, а другие дополняют его всеми алфавитно-цифровыми символами в соответствии с локальным контекстом. При поддержке Юникода \w обычно соответствует любому алфавитно-цифровому символу (важное исключение: в пакете регулярных выражений Java, util. regex и в PCRE, расширении для РНР, метасимвол \w интерпретируется в точности как [a-zA-Z0-9_]).
\W Символ, не входящий в слово.Обычно эквивалентно [ ^\w].
\s Пропуск.В системах, ограничивающихся поддержкой ASCII, часто эквивалентно [·\f\n\r\t\v]. В системах с поддержкой Юникода также часто включает управляющий символ «следующей строки» U+0085, а иногда и свойство \p{Z}.
\S He-пропуск(обычно эквивалентно [^\s]). Локальный контекст POSIX может влиять на интерпретацию некоторых обозначений (особенно \w). В программах с поддержкой Юникода у метасимвола \w обычно имеется больше потенциальных совпадений - например, \р( L}) с символом подчеркивания.
|
|
4.Блоки, категории и свойства Юникода: \p{свойство}, \P{свойство}
На концептуальном уровне Юникод представляет собой отображение множества символов на множество кодов (<sp 141), но стандарт Юникода не сводится к простому перечислению пар. Он также определяет атрибуты символов (например, «этот символ является строчной буквой», «этот символ пишется справа налево», «этот символ является диакритическим знаком, который должен объединяться с другим символом» и т. д.).
Уровень поддержки этих атрибутов зависит от конкретной программы, но многие программы с поддержкой Юникода позволяют находить хотя бы некоторые из них при помощи конструкций г\р{атрибут}} (символ, обладающий указанным атрибутом) и Г\Р{атрибут}} (символ, не обладающий атрибутом). Для примера рассмотрим конструкцию r\p{L}j('L' - атрибут «буква» в отличие от цифр, знаков препинания и тому подобного), которая представляет пример общего свойства (также называемого категорией). Вскоре вы познакомитесь с другими атрибутами, для проверки которых используются конструкции г\р{ }j и Г\Р{-}j, но общие свойства встречаются чаще всего.
|
|
Общие свойства перечислены в табл. 3.8. Каждый символ (а точнее, каждый кодовый пункт, включая и те, для которых символы не определены) может быть идентифицирован по крайней мере по одному общему свойству. Имена общих свойств задаются одиночными символами (V - буква, 'S' - специальный знак и т. д.), но в некоторых системах существуют более информативные синонимы ('Letter', 'Symbol' и т. д.). В частности, они поддерживаются в Perl.
Класс | Синоним и описание |
\p{L} | \р{ Letter} - символы, считающиеся буквами |
\p{М} | \р{Магк} - различные символы, существующие не самостоятельно, а лишь в сочетании с другими базовыми символами (диакритические знаки, рамки и т. д.) |
\p{Z} | \р{Separator} - символы, выполняющие функции разделителей, но не имеющие собственного визуального представления (разнообразные пробелы и т. д.) |
\p{S} | \р{Symbol} - различные декоративные элементы и знаки |
\p{N} | \p{Number} -цифры |
\p{P} | \p{Punctuation} - знаки препинания |
\p{C} | \р{Other} - прочие символы (редко используется при работе с обычным текстом) |
В некоторых системах на однобуквенные имена свойств можно ссылаться без использования фигурных скобок (например, \pL вместо \p{L}). В отдельных системах требуется (или просто допускается) использовать префикс 'In' или 'Is* перед буквой (например, \p{IsL}). При описании конкретных атрибутов будут приведены примеры ситуаций, когда префикс In/Is является обязательным.
|
|
Как показано в табл. ниже каждое однобуквенное общее свойство Юни-кода может делиться на несколько подсвойств, обозначаемых двумя буквами, например свойство «буква» может подразделяться на: «строчная буква», «прописная буква», «первая буква слова», «буква-модификатор» и «остальные буквы». Каждому из подсвойств соответствует точно один кодовый пункт.
Свойство | Описание и синоним |
\p{Ll} | \p {Lowercase.Letter} - строчные буквы. |
\p{Lu} | \p{Uppercase_Letter} - прописные буквы. |
\p{Lt} | \p{Titlecase_Letter} - буквы, находящиеся в начале слова (например, символ Dz в отличие от строчного символа dz и прописного символа DZ). |
\P(L&} | Сокращенная запись для всех символов, обладающих свойствами \p{Ll},\p(Lu}H\p{Lt |
\p{Lm} | \p{Modifier_Letter} - небольшое подмножество специальных символов, по внешнему виду схожих с буквами. |
\p{Lo} | \p{Other_Letter} - буквы, не имеющие регистра и не являющиеся модификаторами, в том числе буквы иврита, бенгали, японского и тибетского языков и т. д. |
\p{Mn} | \p{Non_Spacing_Mark} - «символы», изменяющие другие символы (акценты, умляуты, признаки тональности и т. д.). |
\p{Mc} | \p{Spacing_Combining_Mark} - модификаторы, занимающие собственное место в тексте (в основном обозначения гласных в тех языках, в которых они поддерживаются, включая бенгальский, гуджарати, тамильский, телугу, каннада, малаялам, синхала, мьянмар и кхмерский). |
\p{Me} | \p{Enclosing_Mark} - небольшой набор знаков, внутри которых могут находиться другие символы (круги, квадраты, ромбы и «буквицы»). |
\p{Zs} | \p{Space_Separator} - различные типы пробелов (обычный пробел, неразрывный пробел и пробелы фиксированной ширины). |
\p{Zl} | \p{Line_Separator} - символ LINE SEPARATOR (U+2028). |
\p{Zp} | \p{Paragraph_Separator} - символ PARAGRAPH SEPARATOR (U+2029). |
\p{Sm} | \p{Math_Symbol} -+,-,/,<, ... |
\p{Sc} | \p{Currency_Symbol} - $, C, ¥, €, ... |
\p{Sk} | \p{Modlfier_Symbol} - в основном разновидности комбинационных символов, но также включает ряд самостоятельных символов. |
\p{So} | \p{Other_Symbol} - различные декоративные символы, псевдографика, азбука Брайля и т. д. |
\p{Nd} | \p{Decimal_Digit_Number} - цифры от 0 до 9 в различных алфавитах (кроме китайского, японского и корейского). |
\P(N1} | \p{Letter_Number} - в основном римские цифры. |
\p{No} | \p{Other_Number} - числа в верхних и нижних индексах, дроби; символы, представляющие числа, которые не являются цифрами (кроме китайского, японского и корейского алфавитов). |
\p{Pd} | \p{Dash_Punctuation} - всевозможные дефисы и отрезки. |
\p{Ps} | \p{Open_Punctuatlon} - такие символы, как (, ^, «, ... |
\p{Pe} | \p{Close_Punctuation} - такие символы, как ), **% », |
\p{Pi} | \p{Initial_Punctuation} - такие символы, как «, ", <, ... |
\p{Pf} | \p{Final_Punctuation} - такие символы, как », ', >, ... |
\p{Pc} | \p{Connector_Punctuatlon} - знаки препинания, имеющие особый лингвистический смысл (например, символ подчеркивания). |
\p{Po} | \p{Other_Punctuation} - остальные знаки препинания:!, &, •,:,;, ... |
\p{Cc} | \p{Control} - управляющие символы ASCII и Latin-1 (TAB, LF, CR...) |
\p{Cf} | \p{Format} - неотображаемые символы, являющиеся признаками форматирования. |
\p{Co} | \p{Private_Use} - кодовые пункты, предназначенные для закрытого использования (логотипы компаний и т. д.). |
\p{Cn} | \p{Unassigned} - кодовые пункты, которым не присвоены символы. |
5.Операции с классами: [[a-z]&&[^aeiou]]
|
|
Пакет регулярных выражений для Javaот Sunподдерживает операции множеств с символьными классами (объединение, вычитание, пересечение). Синтаксис их несколько отличается от синтаксиса простого вычитания, описанного в предыдущем разделе (в частности, в языке Javaсинтаксис операции вычитания выглядит несколько странно, например множество всех согласных букв латинского алфавита определяется формулой [[a-z]&&[~aeiou]]). Прежде чем рассматривать операцию вычитания в подробностях, познакомимся с двумя основными операциями над символьными классами - объединения (OR) и пересечения (AND).
Операция объединения включает в классы новые символы. Запись выглядит как определение класса внутри класса: выражение [abcxyz] также можно записать в виде [[abc][xyz]], [abc[xyz]] или [[abc]xyz]. Операция объединения создает новое множество из всех элементов, присутствующих хотя бы в одном из множеств-аргументов. На концептуальном уровне она аналогична оператору «поразрядной дизъюнкции», который во многих языках представляется оператором | или or В символьных классах объединения в основном используются для удобства записи, хотя в некоторых ситуациях полезной оказывается возможность включения инвертированных классов.
Операция пересечения является концептуальным аналогом оператора «поразрядной конъюнкции». Итоговое множество состоит из элементов, присутствующих в обоих множествах-аргументах. Например, выражение [\p{InThai}&&\P{Cn}] совпадает с кодовыми пунктами блока Thai, с которыми ассоциируются символы. Для этого вычисляется пересечение (т. е. совокупность символов, входящих в каждое из множеств) между классами \р{InThai} и \Р{Сn}. Как говорилось выше, \Р{-} (с прописной Р) совпадает со всем, что не обладает заданным атрибутом. Таким образом, \Р{Сn} совпадает со всеми кодовыми пунктами, которые не обладают атрибутом отсутствия ассоциированных символов, а проще говоря, со всеми пунктами, у которых имеются ассоциированные символы (если бы разработчики Sun поддержали атрибут Assigned вместо \Р{Сn} в данном примере, можно было бы использовать запись \p{Assigned}).
Будьте внимательны и не путайте пересечение с объединением. Интуитивность этих терминов зависит от точки зрения. Например, конструкция [[this][that]] обычно формулируется в виде «допускаются символы, совпадающие с [this] или [that]», но ее с таким же успехом можно прочитать как «список допустимых символов состоит из [this] и [that]». Две точки зрения на одно и то же явление.
Смысл операции пересечения более очевиден, например, выражение [\р{InThai}&&\P{Cn}] обычно читается как: «символы, соответствующие одновременно классу \р{InThai} и \Р{Сn}, хотя его можно прочитать и как: «список символов, представляющий собой пересечение
\p{InThai} и \Р{Сn}».
Эти две различных точки зрения могут вносить путаницу: вместо использования союзов И и ИЛИ иногда бывает удобнее использовать термин ПЕРЕСЕЧЕНИЕ и союз И.
Вычитание
Возвращаясь к примеру [\p{InThai }&&\P{Cn} ], будет полезно заметить, что конструкция \Р{Сn} эквивалентна [~\р(Сn}], поэтому все выражение можно переписать в несколько усложненном виде [\р{InThai}&&[|\р{Сn}]]. Более того, категория «пункты с ассоциированными символами в блоке Thai» эквивалентна категории «все пункты блока Thai за исключением пунктов, не имеющих ассоциированных символов». Двойное отрицание слегка усложняет формулировку, но вы можете легко убедиться, что выражение [\p(InThai}&&[^\p(Cn}]] означает «\p{InThai} минус \р{Сn}».
Итак, мы возвращаемся к примеру [[a-z]&&[~aeiou]], в нем продемонстрирована операция вычитания классов. Суть состоит в том, что выражение [this&&[~thaf]]означает: «[this] минус [that]».Лично у меня от двойного отрицания && и [^…] голова идет кругом, поэтому я предпочитаю просто запомнить шаблон […&&[^…]]
6.Комбинационные последовательности Юникода: \X
Perl и РНР поддерживают метасимвол \Х как сокращение шаблона \P{M}\p{M}*, который представляет собой расширенный вариант . . Он соответствует базовому символу (любому, не соответствующему \р{М}), за которым может следовать произвольное число комбинационных символов (все, что соответствует \р{М}).
Юникод определяет начертание отдельных символов с диакритическими знаками, например à (базовый символ a U+0061 комбинируется с диакритическим знаком ‘ U+0300) как комбинацию из базового и комбинационного символов.
При попытке отыскать совпадения со словами «francais» и «français» использование шаблона f ran. ais или f ran[c?]ais может не обеспечивать результат, поскольку в обоих шаблонах предполагается, что символу ç соответствует один кодовый пункт Юникода U+00C7, и не учитывается, что этому символу может соответствовать символ 'с' со следующей за ним седилью (U+0063 U+0327). Для обеспечения точного совпадения можно было бы использовать шаблон f ran[c ¸I ç ]ais, но в данном случае неплохой заменой для fran.ais мог бы служить шаблон fran\Xais.
Кроме того, что \Х соответствует любым комбинационным символам, существует еще два отличия \Х от точки. Первое отличие заключается в том, что \Х всегда соответствует символу новой строки и другим завершителям строк Юникода,тогда как поведение точки зависит от выбранного режима обработки регулярных выражений. Второе отличие состоит в том, что в однострочном режиме точка соответствует любому символу, тогда как \X не может соответствовать начальному комбинационному символу (не идущему вслед за базовым).
7. Символьные классы POSIX: [[:alpha:]]
То, что мы обычно называли символьным классом, в стандарте POSIXбыло решено назвать групповым выражением (bracket expression). В POSIXтермин «символьный класс» относится к специальной конструкции, используемой внутри группового выражения, которую можно рассматривать как своего рода предшественника свойств символов в Юникоде.
Символьный класс POSIX представляет собой одну из нескольких специальных метапоследовательностей, используемых внутри групповых выражений в стандарте POSIX. Примером является конструкция [:lower:], соответствующая любой букве нижнего регистра в текущем локальном контексте. Для обычного английского текста конструкция [: lower:] означает интервал a-z. Поскольку вся метапоследовательность действительна только внутри группового выражения, класс, сравнимый с [a-z], имеет вид [[ :lower: ]]. Да, это выглядит уродливо, но предоставляет дополнительную возможность включения других символов – ö, ň и т. д. (если в локальном контексте они действительно являются символами «нижнего регистра»).
Точный список символьных классов POSIX зависит от локального контекста, но следующие конструкции поддерживаются в большинстве систем:
:alnun: | алфавитные символы и цифровые символы |
:alpha: | алфавитные символы |
:blank: | пробел и табуляция |
:cntrl: | управляющие символы |
:digit: | цифры |
:graph: | отображаемые символы (не пробелы, не управляющие символы и т. д.) |
:lower: | алфавитные символы нижнего регистра |
:print: | аналог [:graph: ], но включает пробел |
:space: | все пропуски ([:blank: ], символ новой строки, возврат курсора и т. д.) |
: upper: | алфавитные символы верхнего регистра |
: xdlgit: | цифры, допустимые в шестнадцатеричных числах (т. е. 0-9a-fA-F) |
:punct: | Знаки препинания |
Системы, в которых поддерживаются свойства Юникода (^ 159), могут по своему усмотрению расширять поддержку этих свойств до конструкций POSIX. Обычно предпочтение отдается свойствам Юникода, поскольку они обладают большими возможностями, нежели их аналоги в POSIX.
8. Объединяющие последовательности POSIX: [[.span-11.]]
В локальном контексте могут определяться объединяющие последовательности, описывающие интерпретацию некоторых символов или совокупностей символов при сортировке и других операциях. Например, в испанском языке символы ll (как, например, в слове tortilla), традиционно сортируются, как если бы это был одиночный символ между l и m, а символ Я в немецком языке находится между s и t, но сортируется как два символа ss. Эти правила выражаются объединяющими последовательностями, которым, например, могут быть присвоены имена span-ll и eszet.
В механизме регулярных выражений, соответствующем стандарту POSIX, объединяющие последовательности, отображающие несколько физических символов на один логический символ (как в span-11), рассматриваются как один символ. Это означает, что символьный класс типа [~abc] совпадет с последовательностью ll.
Для включения элементов объединяющих последовательностей в групповые выражения используется обозначение [. .]: выражение torti[[.span-11.]]a совпадает с tortilla. Объединяющая последовательность позволяет осуществлять сравнение символов, которые представляют собой комбинации других символов. Кроме того, становятся возможными ситуации, при которых групповое выражение совпадает с последовательностью из нескольких физических символов!
9. Символьные эквиваленты POSIX: [[=n=]]
В некоторых локальных контекстах определяются символьные эквиваленты {character equivalents), указывающие, что какие-то из символов должны считаться идентичными при выполнении сортировки и других аналогичных операций. Например, локальный контекст может определить класс-эквивалент n, содержащий символы n и ň или класс a содержащий символы a, à и á. Используя запись, аналогичную приведенной выше конструкции [: … :], и заменив двоеточия знаками равенства, можно ссылаться на классы-эквиваленты в групповых выражениях; например, [[=n=][=a=]] совпадает с любым из перечисленных символов.
Если символьный эквивалент с однобуквенным именем используется, но не определяется в локальном контексте, он по умолчанию совпадает с объединяющей последовательностью с тем же именем. Локальные контексты обычно содержат объединяющие последовательности для всех обычных символов ([. а. ], [. Ь. ], [ .с. ] и т. д.), поэтому при отсутствии специальных эквивалентов конструкция [[=n=][=a=]] по умолчанию считается идентичной [na].
- Якорные метасимволы и другие проверки с нулевой длиной совпадения.
1. Начало строки, начало логической строки: ^, \A
Метасимвол ^ совпадает в начале текста, в котором производится поиск, или в расширенном режиме привязки к границам строк -в позиции после любого символа новой строки. В некоторых системах в расширенном режиме ^ также может совпадать с завершителями строк Юникода.
Метасимвол \A (если он поддерживается) совпадает только в начале текста независимо от режима поиска.
2. Конец строки, конец логической строки: $, \Z, \z
Концепция «конца строки» несколько сложнее парной ей концепции начала строки. В разных реализациях $ интерпретируется по-разному. В самом распространенном варианте он совпадает с концом целевого текста перед завершающим символом новой строки. Это сделано для того, чтобы выражения вида s$ («строка, заканчивающаяся символом s») совпадали с комбинациями символов '•••s\n' в тексте, когда строки завершаются буквой s и символом новой строки.
В других распространенных интерпретациях $ совпадает только в конце всего фрагмента или перед любым символом новой строки. В некоторых системах с поддержкой Юникода символы новой строки в этих правилах заменяются завершителями строк Юникода. (Например, язык Java реализует самую сложную семантику $ в отношении завершителей Юникода)
Выбор режима может повлиять на интерпретацию $, в результате он будет соответствовать любым промежуточным символам новой строки в блоке текста (а также любым завершителям Юникода).
Метасимвол \Z (если он поддерживается) обычно соответствует метасимволуr$ в стандартном режиме, что часто означает совпадение в конце текста или перед символом новой строки, завершающим текст. Парный метасимвол \z совпадает только в конце строки без учета возможных символов новой строки.
3. Начало совпадения (или конец предыдущего совпадения): \G
Метасимвол \G впервые появился в Perl и предназначался для проведения глобального поиска с модификатором /g . Он совпадает с позицией, в которой завершилось предыдущее совпадение. При первой итерации \G совпадает только в начале строки, как и метасимвол \A.
Если попытка поиска завершилась неудачей, позиция \G возвращается в начало строки. Таким образом, при многократном применении регулярного выражения (как при использовании команды s/-/-/g или других средств глобального поиска) неудача при очередном поиске приводит к сбросу позиции \G для применения следующего выражения.
В Perl метасимвол \G обладает тремя уникальными особенностями, которые мне кажутся весьма интересными и полезными.
· Позиция, связанная с \G, является атрибутом целевой строки, а не регулярного выражения. Это позволяет последовательно применить к строке несколько регулярных выражений, причем метасимвол \G в каждом из них продолжит поиск с той позиции, на которой он был прерван для предыдущего выражения.
· Операторы регулярных выражений Perl поддерживают модификатор /с, при помощи которого можно указать, что в случае неудачного поиска позиция \G не сбрасывается, а остается в последней позиции. В сочетании с первым пунктом это помогает организовать проверку по нескольким регулярным выражениям с одной позиции целевого текста, которая смещается только при обнаружении совпадения.
· Текущую позицию метасимвола \G можно получить и изменить с использованием средств, не имеющих отношения к регулярным выражениям (функция pos). Например, ее можно задать так, чтобы поиск начинался с заданной позиции. Кроме того, поддержка этой возможности в языке позволяет имитировать функциональность предыдущего пункта, если она не поддерживается напрямую.
Примеры практического использования этих возможностей приводятся во врезке на следующей странице. Несмотря на наличие этих удобных возможностей, у метасимвола \G в Perl имеется недостаток - он работает надежно лишь в том случае, если находится в самом начале регулярного выражения. К счастью, именно там он используется наиболее естественным образом.
Дата добавления: 2018-04-04; просмотров: 457; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!