Regex - справочник по свойствам Юникода и примеры

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

http://i47.tinypic.com/mbqw6w.png

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

2 ответа

Решение

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

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

В твоем случае,

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

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

Свойства символов Юникода

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

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

Все стандартные свойства Unicode на самом деле состоят из двух частей, как в \p{NAME=VALUE}, Поэтому все однокомпонентные свойства являются дополнением к официальным свойствам Юникода. Булевы свойства со значениями 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}, В man- странице perluniprops перечислены все свойства и их псевдонимы, которые поддерживает Perl, как стандартные свойства Unicode, так и специальные предложения Perl.

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

RL 1.2 Свойства

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

  • General_Category
  • скрипт
  • буквенный
  • Верхний регистр
  • Строчные
  • White_Space
  • Noncharacter_Code_Point
  • Default_Ignorable_Code_Point
  • ЛЮБОЙ, ASCII, НАЗНАЧЕННЫЙ

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

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

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

Библиотека RE2 Расса Кокса с привязками, доступными для C и C++, а также в качестве плагина движка регулярных выражений Perl, и теперь стандартная библиотека регулярных выражений, используемая языком программирования Go, поддерживает два наиболее важных свойства, как General Category и Script.

PCRE и PHP

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

  • Xan Буквенно-цифровой: объединение свойств L и N
  • Xps Пространство POSIX: свойство Z или табуляция, NL, VT, FF, CR
  • Xsp Perl space: свойство 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", для соответствующего свойства, указанного в RL 1.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. Свойства, выделенные серым цветом, защищены свойствами RL 1.2. Для получения дополнительной информации о свойствах см. UAX#44, База данных символов Unicode [UAX44].

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

Три автономных инструмента, которые вы можете захотеть использовать для изучения свойств символов Unicode, - это uniprops, unichars и * uninames. Они также доступны как часть большего набора Unicode:: Tussle от 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)
Другие вопросы по тегам