正则表达式 - Unicode属性参考和示例

时间:2010-01-14 06:17:39

标签: php regex unicode pcre character-properties

我对RegexBuddy提供的正则表达式Unicode属性感到迷茫,我无法区分任何数字属性和数学符号属性似乎只匹配+而不是-,{{1}例如,},*/

RegexBuddy Unicode Properties http://i47.tinypic.com/mbqw6w.png

是否有关于正则表达式Unicode属性的示例的文档/参考?

2 个答案:

答案 0 :(得分:8)

Unicode字符属性

您在示例中列出的那些实际上是所有相同的Unicode字符属性, General Category 属性。一些正则表达式系统仅提供对这一个属性的访问;其他包括访问 Block 属性(不是非常有用)或脚本属性(更多更有用)。

Programming Perl, 4th edition第209页的以下文字中提供了对Perl正则表达式中\p{Property Name}\p{Property Name = Property Value}语法的更完整说明,此处经其作者的许可转载:

  

所有标准Unicode属性实际上由两部分组成,如   \p{NAME=VALUE}。因此,所有单部分属性都是官方Unicode的补充   属性。值为true的布尔属性始终可以缩写   作为单部分属性,允许您为\p{Lowercase}编写\p{Lowercase=True}。除布尔属性之外的其他类型的属性采用字符串,数字,   或枚举值。 Perl还为所有常规提供单部分别名   类别,脚本和块属性,以及来自的一级建议   Unicode Technical Standard #18 on Regular Expressions(第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特性,   太。

section 5 on Properties from UAX#44, the Unicode Character Database中记录了Unicode字符属性的完整列表及其含义。那些必须支持以满足UTS#18’s RL 1.2属性的11个属性是:

  

RL1.2属性

     

为满足此要求,实施应至少提供最少的属性列表,包括以下内容:

     
      
  • General_Category
  •   
  • 脚本
  •   
  • 字母
  •   
  • 大写
  •   
  • 小写
  •   
  • White_Space
  •   
  • Noncharacter_Code_Point
  •   
  • Default_Ignorable_Code_Point
  •   
  • ANY,ASCII,ASSIGNED
  •   

请注意,单字母字符类缩写,例如\w\d\s\b及其大写补充,以及POSIX声音名称与\p{alpha}类似,它们本身是根据UTS#18’s Annex C on Compatibility Properties中的Unicode字符属性定义的。

据我所知,当前符合Level 1 requirements of UTS#18 for Basic Unicode Support正则表达式引擎为PerlICU’s regex library for C and C++Java 7’s Pattern class和{ {3}}。 Android中使用的正则表达式实际上是ICU,而不是人们可能想象的Java,因此使用Unicode可以更好地工作。

对于Java 7,您必须使用UNICODE_CHARACTER_CLASS模式编译标志或嵌入式(?U)来获取RL1.2a(\w& c)内容。对于Matthew Barnett’s excellent regexp library for Python 2 and Python 3,您似乎需要嵌入(*PCRE_UCP),或将其用作编译标记。这可能取决于你的php版本是如何构建的,这可能是一个问题。

Russ Cox的PCRE,其中包含可用于C和C ++的绑定,加上RE2 library,现在是Perl regex engine plugin,支持两个最重要的属性,包括常规类别和脚本。

PCRE& PHP

我相信PCRE仍然不能满足RL 1.2对物业的要求。它处理General Category和Script属性,它们是两个最重要和最常用的属性,但似乎不能让你获得其他九个必需的属性。它的POSIX兼容属性lkike alphaupperlowerspace具体记录为7位ASCII,与the standard regex library used by Go programming language相反。但是,PCRE还提供以下特价:

  • Xan字母数字:属性L和N的联合
  • Xps POSIX空间:属性Z或制表符,NL,VT,FF,CR
  • Xsp Perl空格:属性Z或制表符,NL,FF,CR
  • Xwd Perl字:属性Xan或下划线

请注意,PCRE的\p{Xan}仍然与Unicode所说的\p{alnum}必然意味着不同,因为它缺少组合标记,例如,某些字母符号。 Perl \p{alnum}遵循Unicode定义。在远离方式中,PCRE的\p{Xwd}与Unicode(和Per​​l)不同,因为它缺少额外的字母和其他\p{GC=Connector_Punctuation}字符。 UTS#18的下一版本还将\p{Join_Control}添加到\p{word}个字符集中。

更多属性

在符合RL 1.2和RL 1.2a的四个中,除了Java 7之外,其他所有符合 (或非常接近会议,有时使用\N{…}之类的替代语法代替\p{name=…}语法) RL 1.2a从本月早些时候发布的UTS#18建议更新中获取,部分内容如下:

  

RL2.7完整属性

     

为了满足此要求,实现应支持下面列出的所有受支持Unicode版本的属性,其值与该版本的Unicode定义相匹配。

     

为了满足要求RL2.7,实现必须满足受支持的Unicode版本的属性的Unicode定义,而不是其他可能的定义。但是,实现对这些属性使用的名称可能与属性的正式Unicode名称不同。例如,如果正则表达式引擎已经具有名为"字母"的属性,为了向后兼容,它可能需要使用不同的名称,例如" Unicode_Alphabetic",用于列出的相应属性RL1.2。

     

[表格简称为-chchrist]

     

\p{name=…}\N{…}中使用了Name和Name_Alias属性。 NamedSequences.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字符属性时使用的三个独立工具是the new RL 2.7 on Full Propertiesunipropsunichars。它们也可以作为较大*uninames的一部分使用。

快速演示:

$ 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)

答案 1 :(得分:7)

可以在http://www.unicode.org/Public/UNIDATA/PropList.txt中找到Unicode属性列表。

每个字符的属性都可以在http://www.unicode.org/Public/UNIDATA/UnicodeData.txt(1.2 MB)中找到。

在你的情况下,

  • +(加号)是 Sm
  • -(HYPHEN-MINUS) Pd
  • *(ASTERISK) Po
  • /(SOLIDUS)也是 Po
  • ^(CIRCUMFLEX ACCENT) Sk

最好将它们与[-+*/^]匹配。