正则表达式字符类

[a-z]、\d、\w 等指定字符集合的语法,定义要匹配的字符范围。

正则表达式字符类 (Character Class) 定义了要匹配的字符集合。分为两种类型:使用方括号 [] 的自定义类和 \d、\w 等预定义简写类。作为正则表达式的基本构建块,字符类几乎出现在每个模式中。

自定义字符类中,[a-z] 匹配小写字母,[0-9] 匹配数字,[a-zA-Z0-9] 匹配字母和数字。在开头放置 ^ 创建否定类,[^abc] 匹配除 a、b、c 之外的任意字符。范围用连字符 - 指定,[A-F0-9] 可以简洁地表示十六进制字符集。

预定义类是常用字符集的快捷方式。\d 匹配数字 (等同于 [0-9]),\w 匹配单词字符 ([a-zA-Z0-9_]),\s 匹配空白字符 (空格、制表符、换行符等)。大写版本表示否定:\D 匹配非数字,\W 匹配非单词字符。

预定义类具体包含到哪个范围会因实现而不同,跨语言使用时务必确认。JavaScript 的 \d 即使加上 u 标志也只是半角的 [0-9],并不匹配全角的"1"。而 Python 3 的 \d 连全角的"1"也会匹配,\w 甚至会匹配"漢"这类日文与中文的文字。若只想以半角字母数字为对象,在 Python 中加上 re.ASCII 标志,或像 [0-9] 那样把范围明确写出来才是稳妥的做法。

支持 Unicode 的正则表达式可以使用属性转义如 \p{Script=Hiragana} 来匹配特定脚本或类别的字符。在 JavaScript 中,从 ES2018 开始配合 u 标志使用。处理中文和日文文本时,\p{Script=Han} (汉字)、\p{Script=Katakana} (片假名) 等很有用。使用 ES2024 新增的 v 标志,还可以写成 [\w--_] (从单词字符中去掉下划线) 这样的差集,从而直白地表达组合了多个条件的字符集合。

在字符类内部,大多数元字符被视为字面量,但 ] (类结束)、\ (转义)、^ (开头的否定) 和 - (范围) 保留特殊含义。要将它们作为字面量匹配,需要转义或放在不具有特殊含义的位置。

在字符计数方面,字符类可以用来统计特定类型的字符。例如,\p{Script=Han} 统计汉字数量,\d 统计数字数量,这对文本构成分析很有帮助。

分享这篇文章