不同扩展字符集中汉字的编码范围
根据UnicodeStandard 13. Page 713提供的信息, 如下
表格18-1. 包含汉字的编码区域
区域 范围(十六进制) 注释
CJK 统一表意符 4E00–9FFF 常见
CJK 统一表意符 扩展 A 3400–4DBF 罕见
CJK 统一表意符 扩展 B 20000–2A6DF 罕见, 历史上用过
CJK 统一表意符 扩展 C 2A700–2B73F 罕见, 历史上用过
CJK 统一表意符 扩展 D 2B740–2B81F 不常见, 某些仍在使用
CJK 统一表意符 扩展 E 2B820–2CEAF 罕见, 历史上用过
CJK 统一表意符 扩展 F 2CEB0–2EBEF 罕见, 历史上用过
CJK 统一表意符 扩展 G 30000–3134F 罕见, 历史上用过
CJK 兼容表意符 F900–FAFF 重复字,可统一的变体,公司内部定义用字
CJK 兼容表意符 补充 2F800–2FA1F 可以统一的变体
所以,如果要匹配常用汉字,可以指定编码范围为4E00~9FFF. 如果要包括所有汉字(包括中日韩统一表意符及其扩展),应该联用以上所有范围或根据需要选择,也可以利用以下特性,如Unicode的语言Script来判断.
正则表达式中的其它特性:
1. Unicode Property(属性)
可以用Property来指定字符的功能分类(Unicode 标准 13.0 Page 104.),每个字符只属于某一种属性。例如
标准规定: P代表标点,Z代表分隔符,L代表字母,M代表联合标记,S代表符号,N代表数字。在每个大类下面还可以有一些更细的组合分类。以下这张截图是比较好的总结。
具体用法,如匹配标点可以用
p{P}
如果限定是闭合类型的标点(end punctuation),用 `p{Pe}`
对应它们的排除型数组则为
P{P}
或 `P{Pe}`
将反斜框后面的小写p换成大写P即可,花括号的内容不变。
支持属性的语言有各种 .net语言, Java,Ruby 1.9+, PHP,XPath,PowerShell,XPath。比如VB.net
2.Unicode Block(区域)
Unicode标准还有一个特性,根据编码的范围来限定。前面讲的汉字可以用
p{IsCJKUnifiedIdeographs}
其它的Block有,我圈出来几个和汉字相关的或感兴趣的(看不清楚的可以保存下来再用看图软件打开这个图)
3. Unicode Script 语言
除没有赋值的码点外, 每个Unicode码值都归属于某个Unicode Script(语言).
Unicode的编码表就是按语言(script)来分解的.
值得注意的是, 不同的语言对Unicode Script的支持不一样.
1) VB6,JavaScript不支持Unicode 的各种属性(所有这些p{x}的用法都不支持)
2) VB.net, C#等不支持Unicode Script,
3) 支持Unicode 语言的,
3.1) Perl中用`p{Han}` 或 `p{IsHan}`都可以.
3.2) Java则只认`p{IsHan}`
3.3 )Delphi (TRegEx类) , PHP, PCRE (1和2) 只认`p{Han}`
这些细微的差别不用特别去记住,只需要理解这些属性是什么意思就好. 具体怎么用,用正则测试工具试一下就知道了.
不同的语言中表达Unicode的格式稍有差异
,这里也备忘一下:
为匹配常用汉字:
Python,VB6, VB.net,VBScript,C#,JavaScript,Java,PowerShell中用
[u4E00-u9FFF]+
在反斜杠后面用u再跟Hex值.
Perl,Delphi(TRegEx)在反斜框后面用x再花括号内放置Hex值:
[x{4E00}-x{9FFF}]+
可以这样处理,假定我们默认都是用uFFFF和UFFFFFFFF这样的语法,如果不行,就换成x{FFFF}再试一下;
但也有些正则引擎不支持BMP之外的范围,这就没办法了.
在Latex或MathJax中,表示一个特定Unicode字符用
$unicode[字体名]{0x十六进制码值}$
不需要指定字体时, 方括号部分可以省略(含方括号本身).
推荐两个东东:
正则表达式的图书,推荐余晟的<正则指引>
正则表达式的测试工具,推荐RegexBuddy. 上面的好几个截图都是向这个兄弟借用的