2

我对 RegexBuddy 提供的 Regex Unicode 属性感到迷茫,我无法区分任何数字属性和数学符号属性似乎只匹配+但不匹配-*例如/^

RegexBuddy Unicode 属性

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

4

2 回答 2

11

Unicode 字符属性

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

\p{Property Name}Perl 正则表达式中的and语法更完整的解释在Programming Perl, 4 th edition\p{Property Name = Property Value}的第 209 页的以下文本中给出,在此经作者许可转载:

所有标准 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联机帮助页列出了 Perl 支持的所有属性及其别名,包括标准 Unicode 属性和 Perl 特殊属性。

Unicode 字符属性及其含义的完整列表记录在第 5 节“来自 UAX#44,Unicode 字符数据库的属性”中必须支持这 11 个属性才能满足UTS#18 的 RL 1.2属性:

RL1.2 属性

为了满足这一要求,实现应至少提供一个最小的属性列表,包括以下内容:

  • General_Category
  • 脚本
  • 按字母顺序
  • 大写
  • 小写
  • White_Space
  • Noncharacter_Code_Point
  • Default_Ignorable_Code_Point
  • 任何、ASCII、已分配

请注意,单字母字符类缩写(如\w, \d, \s, \b)及其大写补码,以及类似 POSIX 的名称\p{alpha},它们本身是根据UTS#18 的附录 C 兼容性属性中的 Unicode 字符属性定义的。

据我所知,目前唯一满足 UTS#18 对基本 Unicode 支持的 1 级要求的正则表达式引擎是PerlICU 的 C 和 C++ 正则表达式库Java 7 的Pattern,以及Matthew Barnett 的 Python 2 和 Python 优秀regexp库3 . Android 中使用的正则表达式实际上是 ICU 的,而不是人们想象中的 Java 的,因此使用 Unicode 效果更好。

对于 Java 7,您必须使用UNICODE_CHARACTER_CLASS模式编译标志或嵌入(?U)的 RL1.2a ( \w&c) 内容。对于PCRE,您似乎需要 embed(*PCRE_UCP)或将其用作编译标志。这可能取决于您的 php 版本是如何构建的,这可能是一个问题。

Russ Cox 的RE2 库,具有可用于 C 和 C++ 的绑定,加上作为Perl 正则表达式引擎插件,现在是 Go 编程语言使用的标准正则表达式库,支持两个最重要的属性,通用类别和脚本。

PCRE 和 PHP

我相信 PCRE 距离满足 RL 1.2 对属性的要求还有很长的路要走。它同时处理 General Category 和 Script 属性,这是两个最重要和最常用的属性,但似乎没有让您获得其他九个必需属性。其与 POSIX 兼容的属性 lkike alphaupperlowerspace被明确记录为仅 7 位 ASCII,这违反了RL 1.2a。但是,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(和 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 on Full Properties从提议的更新到UTS#18 本月早些时候发布,部分内容如下:

RL2.7 完整属性

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

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

[为简洁省略了表格-tchrist]

Name 和 Name_Alias 属性用于\p{name=…}\N{…}。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 属性探索工具

unipropsunichars*uninames是您在探索 Unicode 字符属性时可能需要随身携带的三个独立工具。它们也可作为CPAN 更大的 Unicode::Tussle 套件的一部分。

快速演示:

$ 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)
于 2012-03-29T18:00:36.777 回答
7

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

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

在你的情况下,

  • +(加号)是Sm
  • -(连字符-减号) 是Pd ,
  • *(星号)是Po
  • /(SOLIDUS) 也是Po,并且
  • ^(CIRCUMFLEX ACCENT) 是Sk

你最好将它们与[-+*/^].

于 2010-01-14T06:36:41.617 回答