区间按编码排
自定义字符类里的区间遵循字符编码顺序,起点必须小于终点。它表示「从某个字符到另一个字符之间的所有字符都被包含」,两端都算在内,因此区间会连带包含肉眼想不到的符号。
多个区间拼装
一个类里可以并列多个区间与单个字符,表示它们的并集。字母大小写是两个互不相邻的区间,必须各写一段;数字、下划线、连字符这类符号也常常需要单独补进去。
基本信息
| 写法 | 两端字符之间用连字符连接,闭区间 |
|---|---|
| 顺序要求 | 起点编码必须小于终点,反序通常直接报语法错误 |
| 多段拼接 | 区间与单个字符可任意并列,取并集 |
| 大小写 | 大小写字母不连续,需分别写区间 |
| 不可见字符 | 可用转义写法作为区间端点,例如控制字符 |
| 非 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 符号区不相邻 |
| 跨大小写区间 | 会带上中间符号 | 不要用一段区间覆盖大小写 |
| 转义端点 | 控制字符等不可见区间 | 可读性差,务必加注释 |
大小写字母之间夹着若干符号,用一段区间从大写字母跨到小写字母时,这些符号也会被纳入。需要「字母」语义时写两段区间,或按引擎能力改用字母属性类。
非拉丁文字的区间写法依赖字符编码顺序,且不同编码方案下顺序可能不同。需要按语言或类别匹配时,优先使用引擎提供的字符属性类,可读性与可移植性都更好。