我对 RegexBuddy 提供的 Regex Unicode 属性感到迷茫,我无法区分任何数字属性和数学符号属性似乎只匹配+
但不匹配-
,*
例如/
。^
是否有任何文档/参考与正则表达式 Unicode 属性的示例?
我对 RegexBuddy 提供的 Regex Unicode 属性感到迷茫,我无法区分任何数字属性和数学符号属性似乎只匹配+
但不匹配-
,*
例如/
。^
是否有任何文档/参考与正则表达式 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 级要求的正则表达式引擎是Perl、ICU 的 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 距离满足 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、CRXsp
Perl 空格:属性 Z 或制表符、NL、FF、CRXwd
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]。
uniprops、 unichars和*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)
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。你最好将它们与[-+*/^]
.