首页/开发/正则与编码速查/Unicode 通用类别与字符判定

Unicode 通用类别与字符判定

Unicode 通用类别把每个码位归入字母、标记、数字、标点、符号、分隔符、其他七大类(细分到 Lu、Ll、Nd、Mn 等子类),是正则 \p{...}、字符校验与文本切分的通用依据。

正则与编码速查开发更新于 2026-10-17
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌‌‌‌​​​​​‌​‌‌‌‌​‌‌‌​‌​‌​‌‌​‌‌‌​​‌‌​‌​​‌​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​​‌​​​‌‌​​‌​‌​​‌​‌‌​‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌‌​‌‌‌​​‌‌​​‌​‌​‌‌‌​​‌​​‌‌​​​​‌​‌‌​‌‌​​​​‌​‌‌​‌​‌‌​​​‌‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌​‌‌‌‌​‌‌‌​​‌​​‌‌‌‌​​‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​

通用类别是什么

Unicode 为每个码位标注一个通用类别(General Category),一级分为七类:L 字母、M 标记、N 数字、P 标点、S 符号、Z 分隔符、C 其他。二级细分为 Lu 大写字母、Ll 小写字母、Lt 首字母大写、Lm 修饰字母、Lo 其他字母(汉字属此类)、Nd 十进制数字、Mn 非间距标记、Cf 格式字符(如零宽连接符)等。正则与语言内置的字符类判定大多基于这套属性,而不是基于自己维护的字符清单。

基本信息

一级类别L 字母、M 标记、N 数字、P 标点、S 符号、Z 分隔符、C 其他
常用二级Lu 大写、Ll 小写、Lo 其他字母(汉字)、Nd 十进制数字
文本处理关键Mn 非间距标记(组合符号)、Cf 格式字符(零宽字符)
汉字归属汉字属于 Lo(其他字母),不是 Lu/Ll
正则写法多数引擎用 \p{L}、\p{Nd} 等属性类引用
更新方式随 Unicode 版本更新,程序依赖的库版本会影响判定结果

典型使用场景

  • 输入校验:判断是否为字母数字、是否含不可见格式字符
  • 文本切分:识别组合标记,避免把基字母与重音符号拆开
  • 内容风控:发现零宽字符与双向控制符这类异常格式字符
  • 正则匹配:用属性类替代冗长的手写字符范围
  • 排序与统计:按类别汇总文本构成,评估多语言内容质量

类别查询与匹配

类别查询与匹配
python -c "import unicodedata as u; print(u.category('中'), u.category('A'), u.category('1'))"   # Lo Ll Nd
python -c "import unicodedata as u; print(u.category('\u0301'), u.category('\u200b'))"            # Mn(组合重音)Cf(零宽空格)
python -c "import re; print(bool(re.match(r'^\w+$', '中A1')))"                                     # \w 在 Python3 默认含 Unicode 字母
python -c "import re; print(re.findall(r'\p{L}+', 'abc 中 123')) if False else print('property-class-needs-regex-module')"
# 正则属性类在多数引擎里的写法:\p{L} \p{Nd} \p{M};Python 标准库不支持 \p,需用 regex 第三方模块
python -c "import unicodedata as u; print(''.join(c for c in 'a\u200bb' if u.category(c) != 'Cf'))"  # 过滤格式字符

一级类别速查

类别含义典型码位
L 字母含大小写与其他字母A a 中 あ
M 标记组合与修饰标记U+0301 组合重音
N 数字十进制、字母数字、其他数字0-9、罗马数字、上标数字
P 标点连接、破折、引号、括号等U+002D、U+3001
S 符号货币、数学、几何、emoji 等¥ + ★
Z 分隔符空格、行、段分隔U+0020、U+00A0
C 其他控制、格式、私用、代理、未分配U+0009、U+200B
不同语言与库对「字母数字」的定义并不统一:有的按 ASCII 判定,有的按 Unicode 属性判定。同一个输入在不同实现下可能一个通过一个拒绝,接口对接时要明确口径并写进文档。
格式字符(Cf)是文本清洗的重点:零宽连接符、双向控制符肉眼不可见,却会影响比较、长度与显示顺序。校验时应显式检测该类别,而不是只做去空白处理。
类别数据随 Unicode 版本变化,新版本会新增字符与调整归属。库版本不同可能导致同一字符判定不同,跨系统比对时要确认双方使用的 Unicode 数据版本。

易错点

  • 用自维护的字符清单做校验:新增字符无法覆盖,且容易漏掉组合标记与格式字符 → 使用库提供的类别判定
  • 把汉字当大写或小写字母:汉字属 Lo,做大写转换或标题化时会得到意外结果 → 按类别分支处理
  • 忽略 Cf 格式字符:输入里夹带零宽字符绕过校验或破坏比较 → 校验阶段显式剔除或拒绝
  • 假定 \w 就是字母数字:不同引擎与语言默认语义不同,可能只覆盖 ASCII → 明确指定字符类或属性
  • 正则属性类写在不支持的引擎上:直接报错或被当成字面量 → 先确认引擎是否支持 \p{...} 语法

数据来源与参考

  • Unicode 官方:General Category 属性定义(UAX #44)
  • Unicode 官方 Character Database 属性文件说明
  • Python 官方文档:unicodedata.category 与 Unicode 数据版本

整理校对:其其网ICT文档中心 · 本页地址:docs.qiqicto.com/regex/unicode-general-category.html

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌‌‌‌​​​​​‌​‌‌‌‌​‌‌‌​‌​‌​‌‌​‌‌‌​​‌‌​‌​​‌​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​​‌​​​‌‌​​‌​‌​​‌​‌‌​‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌‌​‌‌‌​​‌‌​​‌​‌​‌‌‌​​‌​​‌‌​​​​‌​‌‌​‌‌​​​​‌​‌‌​‌​‌‌​​​‌‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌​‌‌‌‌​‌‌‌​​‌​​‌‌‌‌​​‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​