首页/开发/正则与编码速查/自定义字符类与区间写法
正则基础45 条

自定义字符类与区间写法

自定义字符类的区间按字符编码顺序书写、两端包含,多个区间并列表示并集。大小写字母之间夹着符号,必须写两段区间;非拉丁文字不宜依赖编码区间,应改用字符属性类。

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

区间按编码排

自定义字符类里的区间遵循字符编码顺序,起点必须小于终点。它表示「从某个字符到另一个字符之间的所有字符都被包含」,两端都算在内,因此区间会连带包含肉眼想不到的符号。

多个区间拼装

一个类里可以并列多个区间与单个字符,表示它们的并集。字母大小写是两个互不相邻的区间,必须各写一段;数字、下划线、连字符这类符号也常常需要单独补进去。

基本信息

写法两端字符之间用连字符连接,闭区间
顺序要求起点编码必须小于终点,反序通常直接报语法错误
多段拼接区间与单个字符可任意并列,取并集
大小写大小写字母不连续,需分别写区间
不可见字符可用转义写法作为区间端点,例如控制字符
非 ASCII 区间跨语种区间依赖编码顺序,可靠性差,应改用字符属性类

典型使用场景

  • 校验十六进制字符串、Base64 字符集等固定字母表
  • 限制输入只能是半角字母数字加下划线组成的标识符
  • 匹配控制字符范围,用于二进制或协议字段清洗
  • 构造允许的标点集合,避免把其它符号放进白名单
  • 清理数据时排除不可打印字符

区间写法与边界

区间写法与边界
grep -E '^[A-Za-z0-9_]+$' f.txt     # 大小写要写两段区间
grep -E '^[0-9a-fA-F]+$' f.txt     # 十六进制字符集
grep -E '[-A-Za-z]' f.txt          # 连字符放首位表示它本身
grep -E '[A-Za-z-]' f.txt          # 放末位同样表示本身
sed 's/[^ -~]//g' f.txt            # 只保留可打印的半角字符
grep -E '^[^0-9]' f.txt            # 取反区间:行首不是数字

区间相关写法

写法含义注意点
常规区间两端之间全部字符闭区间,两端包含
连字符放首位或末位连字符本身放中间会被当作区间
大写字母区间半角大写字母与 ASCII 符号区不相邻
跨大小写区间会带上中间符号不要用一段区间覆盖大小写
转义端点控制字符等不可见区间可读性差,务必加注释
大小写字母之间夹着若干符号,用一段区间从大写字母跨到小写字母时,这些符号也会被纳入。需要「字母」语义时写两段区间,或按引擎能力改用字母属性类。
非拉丁文字的区间写法依赖字符编码顺序,且不同编码方案下顺序可能不同。需要按语言或类别匹配时,优先使用引擎提供的字符属性类,可读性与可移植性都更好。

易错点

  • 用一段区间跨越大小写字母,无意中把中间若干符号纳入白名单
  • 区间起点大于终点,PCRE 等引擎直接报语法错误,宽松引擎则当成字面量
  • 把区间写成开区间理解,忘记两端包含,边界字符被误拒或误放
  • 依赖非拉丁文字的编码区间匹配特定语种字符,跨编码方案后结果不可复现

数据来源与参考

  • IEEE POSIX.1-2017 Base Definitions 第 9 章:范围表达式
  • PCRE2 官方文档 pcre2pattern(3):字符类中的范围
  • Python 官方文档 re 模块:字符集与范围说明

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

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