正则表达式入门:从字符类到分组与常用模式
正则表达式是一套用来描述字符串规则的工具。它不依赖某一种编程语言,几乎所有主流语言都内置了对它的支持。学会它之后,很多原本需要写几十行判断逻辑的字符串处理工作,一行模式就能完成。本文从字符类出发,逐步讲到量词、锚点、分组,再给出几个可以直接套用的常用模式。
一、字符类:先说明能匹配什么
字符类用一对方括号表示,意思是方括号里列出的任意一个字符都算匹配成功。
[abc] 匹配 a、b、c 中的任意一个
[a-z] 匹配任意一个小写字母
[A-Z] 匹配任意一个大写字母
[0-9] 匹配任意一个数字
[^abc] 匹配除 a、b、c 之外的任意一个字符
[a-zA-Z] 匹配任意一个英文字母
方括号里的连字符表示范围,脱字符放在最前面表示取反。除了手写范围,还可以直接使用几个常见的简写:
\d 数字,等价于 [0-9]
\D 非数字
\w 字母、数字或下划线
\W 不是字母、数字或下划线的字符
\s 空白字符,包括空格、制表符和换行
\S 非空白字符
. 除换行之外的任意一个字符
初学者常犯的错误,是把点号当成普通字符。点号本身是通配符,如果要匹配真正的点,需要写成转义形式。同样,方括号、圆括号、星号、加号、问号这些符号在正则里都有特殊含义,需要匹配它们本身时,前面要加反斜杠。
二、量词:说明出现多少次
只写一个字符类,一次只能匹配一个字符。量词的作用,就是说明前面的元素可以出现多少次。
* 出现零次或多次
+ 出现一次或多次
? 出现零次或一次
{n} 恰好出现 n 次
{n,} 至少出现 n 次
{n,m} 出现 n 到 m 次
举几个例子:
\d+ 一个或多个数字
[a-z]{3} 恰好三个小写字母
\w{6,16} 6 到 16 位的字母、数字或下划线
colou?r 既能匹配 color,也能匹配 colour
量词默认是贪婪的,也就是在满足整体匹配的前提下,尽量多地匹配。例如用 .* 去匹配一段文字,它会一直吃到最后一个可能的位置。如果想让它少匹配一点,可以在量词后面再加一个问号,写成懒惰量词,例如 .*?。在处理成对出现的符号时,懒惰量词往往更符合直觉。
三、锚点:说明位置在哪里
字符类和量词解决的是匹配什么、匹配多少次,锚点解决的是在什么位置匹配。锚点本身不消耗字符,只对位置提出要求。
^ 字符串的开头
$ 字符串的结尾
\b 单词边界
\B 非单词边界
^\d+$ 表示整个字符串必须全部由数字组成,开头和结尾的锚点把范围锁死,中间就不会混进其他字符。去掉锚点之后,\d+ 只要求字符串里有一段数字就算匹配,这在做整体校验时很容易放过不合格的输入。做输入校验时,锚点几乎是必不可少的。
四、分组与选择:把规则组合起来
圆括号的作用是分组。被括号包起来的部分会被当成一个整体,量词可以直接作用在整个分组上,分组内部的匹配结果还可以被捕获下来,在替换时重复使用。
(ab)+ 连续出现一次或多次的 ab
(ha){2} 恰好出现两次的 ha
竖线表示选择,意思是左右两边任意一边成立即可。
cat|dog 匹配 cat 或者 dog
(2025|2026) 匹配其中的一个年份数字
需要注意选择的作用范围。ab|cd 匹配的是 ab 或者 cd,而不是 a 加上 b 或 c 再加上 d。如果想把选择限制在更小的范围里,要用括号把它包起来,例如 a(b|c)d。
如果只需要分组,不需要捕获结果,可以使用非捕获分组 (?:...)。它在逻辑上和普通分组一样,只是不保存匹配结果,写长表达式时可以减少干扰。
(?:ab)+ 分组但不捕获
(\d+)-(\d+) 两个分组分别捕获两段数字
捕获分组在替换时很有用。很多编辑器和编程语言都支持用类似第一组、第二组的方式引用前面匹配到的内容,例如把一对数字调换顺序,或者给一段文字统一加上标记。
五、几个可以直接套用的常用模式
下面是日常开发中出现频率很高的几类模式。直接拿去用之前,先结合自己的业务规则确认细节,例如长度、允许的字符、是否区分大小写。
纯数字: ^\d+$
用户名: ^[a-zA-Z][a-zA-Z0-9_]{5,15}$
年份加月份: ^\d{4}-(0[1-9]|1[0-2])$
日期: ^\d{4}-\d{2}-\d{2}$
手机号: ^1[3-9]\d{9}$
去除首尾空白: ^\s+|\s+$
连续空白压缩: \s+
以用户名为例:第一位必须是字母,后面可以是字母、数字或下划线,总长度控制在 6 到 16 位。把这个规则拆开看,就是锚点加字符类加量词的组合,理解了前面几节,读懂它并不难。
六、写正则的三个习惯
第一,从最小的例子开始。先写一个能匹配最简单输入的模式,确认没问题再逐步加上边界条件。一次写完再调试,往往不知道是哪一段出了问题。
第二,给模式加上锚点。校验类场景要明确整段字符串是否符合规则,搜索类场景才适合去掉锚点,只找其中一段。
第三,用真实数据验证。准备几组应该通过的输入和几组应该拒绝的输入,逐一跑一遍。特别是边界值,例如空字符串、刚好达到长度上限的输入、包含空格或特殊符号的输入,最容易暴露问题。
结语
正则表达式的核心并不复杂:字符类决定能匹配什么,量词决定出现多少次,锚点决定在什么位置匹配,分组和选择负责把这些小规则组合成大规则。掌握这四层,再对照常用模式多练几次,日常的字符串校验、提取和替换工作就会轻松很多。
- 点赞
- 收藏
- 关注作者
评论(0)