Regex - справочник по свойствам Юникода и примеры - PullRequest
2 голосов
/ 14 января 2010

Я чувствую себя потерянным из-за свойств Regex Unicode, представленных RegexBuddy, я не могу различить ни одно из свойств Number, и свойство символа Math только кажется, что оно соответствует +, но не -, *, /, ^ например.

RegexBuddy Unicode Properties

Есть ли какая-либо документация / ссылка с примерами по свойствам Юникода регулярных выражений?

Ответы [ 2 ]

9 голосов
/ 29 марта 2012

Свойства символов Unicode

Те, что вы перечислили там в своем примере, на самом деле являются тем же свойством символа Юникода, свойством Общая категория . Некоторые системы регулярных выражений предоставляют доступ только к одному этому свойству; другие включают доступ к свойству Block (не очень полезно) или к свойству Script ( много более полезно).

Более полное объяснение синтаксиса \p{Property Name} и \p{Property Name = Property Value} в регулярных выражениях Perl дано в следующем тексте на странице 209 ? Программирование на Perl, 4 th edition , воспроизведено с разрешения автора: its

Все стандартные свойства Unicode на самом деле состоят из двух частей, как в \p{NAME=VALUE}. Поэтому все однокомпонентные свойства являются дополнением к официальному Unicode свойства. Булевы свойства, значения которых имеют значение true, всегда могут быть сокращены как однокомпонентные свойства, которые позволяют записать \p{Lowercase} для \p{Lowercase=True}. Другие типы свойств, кроме логических свойств, принимают строковые, числовые, или перечисляемые значения. Perl также предоставляет псевдонимы из одной части для всех общих свойства категорий, сценариев и блоков, а также рекомендации первого уровня от Технический стандарт Unicode # 18 на регулярные выражения (версия 13, от 2008-08), например \p{Any}.

Например, \p{Armenian}, \p{IsArmenian} и \p{Script=Armenian} все представляют то же свойство, что и \p{Lu}, \p{GC=Lu}, \p{Uppercase_Letter} и \p{General_Category=Uppercase_Letter}. Другие примеры бинарных свойств (те, чьи значения неявно истинны) включают \p{Whitespace}, \p{Alphabetic}, \p{Math} и \p{Dash}. Примеры свойств, которые не являются двоичными свойствами включают \p{Bidi_Class=Right_to_Left}, \p{Word_Break=A_Letter} и \p{Numeric_Value=10}. perluniprops manpage перечисляет все свойства и их псевдонимы, которые поддерживает Perl, как стандартные свойства Unicode, так и специальные Perl, тоже.

Полный список свойств символов Unicode и их значения задокументирован в разделе Свойства на UAX # 44, База данных символов Unicode . Те одиннадцать свойств, которые должны поддерживаться для соответствия RTS 1.2 UTS # 18 в свойствах, таковы:

RL1.2 Свойства

Для удовлетворения этого требования реализация должна предоставлять как минимум минимальный список свойств, состоящий из следующего:

  • General_Category
  • Сценарий
  • Алфавитный указатель
  • Прописные
  • Строчные
  • White_Space
  • Noncharacter_Code_Point
  • Default_Ignorable_Code_Point
  • ЛЮБОЙ, ASCII, НАЗНАЧЕН

Обратите внимание, что однобуквенные символьные аббревиатуры, такие как \w, \d, \s, \b и их заглавные дополнения, а также POSIX-звучащие имена, такие как \p{alpha}, сами определены с точки зрения свойств символов Unicode в UTS # 18 Приложение C о свойствах совместимости .

Насколько мне известно, только движки регулярных выражений, в настоящее время удовлетворяющие требованиям уровня 1 UTS # 18 для базовой поддержки Unicode , составляют Perl , Библиотека регулярных выражений ICU для C и C ++ , Java 7 Pattern class и Прекрасная библиотека regexp Мэтью Барнетта для Python 2 и Python 3 . Регулярные выражения, используемые в Android, на самом деле являются ICU, а не Java, как можно было бы представить, и поэтому работают с Unicode намного лучше.

Для Java 7 вы должны использовать флаг компиляции шаблона UNICODE_CHARACTER_CLASS или встроенный (?U), чтобы запустить RL1.2a (\w & c). Для PCRE вам нужно встроить (*PCRE_UCP) или использовать его как флаг компиляции. Это может зависеть от того, как была построена ваша версия php, что может быть проблемой.

Расс Кокса RБиблиотека E2 , с привязками, доступными для C и C ++, плюс Плагин движка регулярных выражений Perl , а теперь стандартная библиотека регулярных выражений, используемая языком программирования Go , поддерживает два наиболее важных свойства, как общая категория, так и сценарий.

PCRE & PHP

Я считаю, что PCRE все еще не соответствует требованиям RL 1.2 к свойствам. Он обрабатывает свойства General Category и Script, которые являются двумя наиболее важными и часто используемыми свойствами, но, похоже, не позволяет получить остальные девять необходимых свойств. Его POSIX-совместимые свойства lkike alpha, upper, lower и space специально задокументированы как только 7-битные ASCII, в отличие от RL 1.2a . Тем не менее, PCRE также предлагает эти специальные предложения:

  • Xan Буквенно-цифровой: объединение свойств L и N
  • Xps Пространство POSIX: свойство Z или табуляция, NL, VT, FF, CR
  • Xsp Пробел Perl: свойство Z или табуляция, NL, FF, CR
  • Xwd Perl word: свойство Xan или подчеркивание

Обратите внимание, что PCRE \p{Xan} все еще отличается от того, что должно означать Unicode \p{alnum}, потому что в нем отсутствуют, например, метки объединения и некоторые буквенные символы. Perl \p{alnum} соответствует определению Unicode. В отличие от PCRE \p{Xwd} отличается от Unicode (и Perl) тем, что в нем отсутствуют лишние алфавиты и остальные символы \p{GC=Connector_Punctuation}. Следующая редакция UTS # 18 также добавляет \p{Join_Control} к набору \p{word} символов.

Дополнительные свойства

Из этих четырех, которые соответствуют RL 1.2 и RL 1.2a, все, кроме Java 7, также встречают (или очень близко подходят к встрече, иногда в альтернативном синтаксисе, таком как \N{…} вместо \p{name=…} синтаксис) новый RL 2.7 на полных свойствах из предложенного обновления к UTS # 18, опубликованного ранее в этом месяце, который читается частично:

RL2.7 Полные свойства

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

Чтобы соответствовать требованию RL2.7, реализация должна удовлетворять определению Unicode свойств для поддерживаемой версии Unicode, а не другим возможным определениям. Однако имена, используемые реализацией для этих свойств, могут отличаться от формальных имен Unicode для свойств. Например, если механизм регулярных выражений уже имеет свойство под названием «Alphabetic», для обратной совместимости может потребоваться использование отдельного имени, такого как «Unicode_Alphabetic», для соответствующего свойства, указанного в RL1.2.

[таблица опущена для краткости —христ]

Свойства Name и Name_Alias ​​используются в \p{name=…} и \N{…}. Данные в NamedSeptions.txt также используются в \N{…}. Для получения дополнительной информации см. Раздел 2.5, Свойства имени. Свойства Script и Script_Extensions используются в \p{scx=…}. Для получения дополнительной информации см. Раздел 1.2.2, Script_Property. Список исключает дополнительные, устаревшие и устаревшие свойства, большинство предварительных свойств, а также свойства Unicode_1_Name и Unicode_Radical_Stroke. Свойства, выделенные серым цветом, защищены свойствами RL1.2. Для получения дополнительной информации о свойствах см. UAX # 44, База данных символов Unicode [UAX44].

Инструменты исследования свойств Unicode

Три автономных инструмента, которые вы, возможно, захотите использовать для изучения свойств символов Unicode: uniprops , unichars и * uninames . Они также доступны как часть большого Unicode :: Tussle suite от CPAN .

Быстрые демонстрации:

$ uniprops -a 3b1
U+03B1 ‹α› \N{GREEK SMALL LETTER ALPHA}
    \w \pL \p{LC} \p{L_} \p{L&} \p{Ll}
    All Any Alnum Alpha Alphabetic Assigned Greek Is_Greek InGreek Cased Cased_Letter LC
       Changes_When_Casemapped CWCM Changes_When_Titlecased CWT Changes_When_Uppercased CWU Ll L Gr_Base
       Grapheme_Base Graph GrBase Grek Greek_And_Coptic ID_Continue IDC ID_Start IDS Letter L_
       Lowercase_Letter Lower Lowercase Print Word XID_Continue XIDC XID_Start XIDS X_POSIX_Alnum
       X_POSIX_Alpha X_POSIX_Graph X_POSIX_Lower X_POSIX_Print X_POSIX_Word
    Age=1.1 Bidi_Class=L Bidi_Class=Left_To_Right BC=L Block=Greek Block=Greek_And_Coptic BLK=Greek
       Canonical_Combining_Class=0 Canonical_Combining_Class=Not_Reordered CCC=NR
       Canonical_Combining_Class=NR Decomposition_Type=None DT=None East_Asian_Width=A
       East_Asian_Width=Ambiguous EA=A Grapheme_Cluster_Break=Other GCB=XX Grapheme_Cluster_Break=XX
       Script=Greek Hangul_Syllable_Type=NA Hangul_Syllable_Type=Not_Applicable HST=NA
       Joining_Group=No_Joining_Group JG=NoJoiningGroup Joining_Type=Non_Joining JT=U Joining_Type=U
       Line_Break=AL Line_Break=Alphabetic LB=AL Numeric_Type=None NT=None Numeric_Value=NaN NV=NaN
       Present_In=1.1 IN=1.1 Present_In=2.0 IN=2.0 Present_In=2.1 IN=2.1 Present_In=3.0 IN=3.0 Present_In=3.1
       IN=3.1 Present_In=3.2 IN=3.2 Present_In=4.0 IN=4.0 Present_In=4.1 IN=4.1 Present_In=5.0 IN=5.0
       Present_In=5.1 IN=5.1 Present_In=5.2 IN=5.2 Present_In=6.0 IN=6.0 SC=Grek Script=Grek
       Sentence_Break=LO Sentence_Break=Lower SB=LO Word_Break=ALetter WB=LE Word_Break=LE

$ unichars '\pN' '\D' '\p{Latin}'
 Ⅰ      8544  02160  ROMAN NUMERAL ONE
 Ⅱ      8545  02161  ROMAN NUMERAL TWO
 Ⅲ      8546  02162  ROMAN NUMERAL THREE
 Ⅳ      8547  02163  ROMAN NUMERAL FOUR
 Ⅴ      8548  02164  ROMAN NUMERAL FIVE
 Ⅵ      8549  02165  ROMAN NUMERAL SIX
 Ⅶ      8550  02166  ROMAN NUMERAL SEVEN
 Ⅷ      8551  02167  ROMAN NUMERAL EIGHT
 (etc)

$ uninames Old English
 æ  00E6        LATIN SMALL LETTER AE
        = latin small ligature ae (1.0)
        = ash (from Old English æsc)
        * Danish, Norwegian, Icelandic, Faroese, Old English, French, IPA
        x (latin small ligature oe - 0153)
        x (cyrillic small ligature a ie - 04D5)
 ð  00F0        LATIN SMALL LETTER ETH
        * Icelandic, Faroese, Old English, IPA
        x (latin capital letter eth - 00D0)
        x (greek small letter delta - 03B4)
        x (partial differential - 2202)
 þ  00FE        LATIN SMALL LETTER THORN
        * Icelandic, Old English, phonetics
        * Runic letter borrowed into Latin script
        x (runic letter thurisaz thurs thorn - 16A6)
 œ  0153        LATIN SMALL LIGATURE OE
        = ethel (from Old English eðel)
        * French, IPA, Old Icelandic, Old English, ...
        x (latin small letter ae - 00E6)
        x (latin letter small capital oe - 0276)
 ƿ  01BF        LATIN LETTER WYNN
        = wen
        * Runic letter borrowed into Latin script
        * replaced by "w" in modern transcriptions of Old English
        * uppercase is 01F7
        x (runic letter wunjo wynn w - 16B9)
 ǣ  01E3        LATIN SMALL LETTER AE WITH MACRON
        * Old Norse, Old English
        : 00E6 0304
 ⁊  204A        TIRONIAN SIGN ET
        * Irish Gaelic, Old English, ...
        x (ampersand - 0026)
7 голосов
/ 14 января 2010

Список свойств Unicode можно найти в http://www.unicode.org/Public/UNIDATA/PropList.txt.

Свойства для каждого символа можно найти в http://www.unicode.org/Public/UNIDATA/UnicodeData.txt (1,2 МБ).

В вашем случае

  • + (ЗНАК ПЛЮС) равен Sm ,
  • - (ГИФЕН-МИНУС) равен Pd ,
  • * (звездочка) - Po ,
  • / (SOLIDUS) также Po и
  • ^ (CIRCUMFLEX ACCENT) составляет Sk .

Вам лучше сопоставить их с [-+*/^].

...