dingsir的个人博客分享 http://blog.sciencenet.cn/u/dingsir

博文

中文字符的正则匹配 备忘

已有 2962 次阅读 2021-3-5 18:57 |个人分类:软件杂谈|系统分类:教学心得

不同扩展字符集中汉字的编码范围

根据UnicodeStandard 13.  Page 713提供的信息, 如下

表格18-1.  包含汉字的编码区域

区域范围(十六进制)注释
CJK 统一表意符 4E00–9FFF常见
CJK 统一表意符  扩展 A3400–4DBF罕见
CJK 统一表意符  扩展 B20000–2A6DF罕见, 历史上用过
CJK 统一表意符  扩展 C2A700–2B73F罕见, 历史上用过
CJK 统一表意符  扩展 D2B740–2B81F不常见, 某些仍在使用
CJK 统一表意符  扩展 E2B820–2CEAF罕见, 历史上用过
CJK 统一表意符  扩展 F2CEB0–2EBEF罕见, 历史上用过
CJK 统一表意符  扩展 G30000–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代表数字。在每个大类下面还可以有一些更细的组合分类。以下这张截图是比较好的总结。

Unicode 属性.png

具体用法,如匹配标点可以用

\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}

来匹配CJK统一表意符(包括中日韩汉字)。

其它的Block有,我圈出来几个和汉字相关的或感兴趣的(看不清楚的可以保存下来再用看图软件打开这个图)

Unicode Block.png

Unicode Block.png

3. Unicode Script 语言

除没有赋值的码点外, 每个Unicode码值都归属于某个Unicode Script(语言).

Unicode Script.png

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. 上面的好几个截图都是向这个兄弟借用的




https://blog.sciencenet.cn/blog-1213210-1275174.html

上一篇:电解液溶剂的几点花边知识
下一篇:用Perl解析配方文本的尝试

0

该博文允许注册用户评论 请点击登录 评论 (3 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2021-12-7 10:09

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部