正则表达式入门:从字符类到分组与常用模式

举报
神的孩子都在跳舞 发表于 2026/11/13 08:55:22 2026/11/13
【摘要】 正则表达式是一套用来描述字符串规则的工具。它不依赖某一种编程语言,几乎所有主流语言都内置了对它的支持。学会它之后,很多原本需要写几十行判断逻辑的字符串处理工作,一行模式就能完成。本文从字符类出发,逐步讲到量词、锚点、分组,再给出几个可以直接套用的常用模式。 一、字符类:先说明能匹配什么字符类用一对方括号表示,意思是方括号里列出的任意一个字符都算匹配成功。[abc] 匹配 a、b、c...

正则表达式是一套用来描述字符串规则的工具。它不依赖某一种编程语言,几乎所有主流语言都内置了对它的支持。学会它之后,很多原本需要写几十行判断逻辑的字符串处理工作,一行模式就能完成。本文从字符类出发,逐步讲到量词、锚点、分组,再给出几个可以直接套用的常用模式。

一、字符类:先说明能匹配什么

字符类用一对方括号表示,意思是方括号里列出的任意一个字符都算匹配成功。

[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 位。把这个规则拆开看,就是锚点加字符类加量词的组合,理解了前面几节,读懂它并不难。

六、写正则的三个习惯

第一,从最小的例子开始。先写一个能匹配最简单输入的模式,确认没问题再逐步加上边界条件。一次写完再调试,往往不知道是哪一段出了问题。

第二,给模式加上锚点。校验类场景要明确整段字符串是否符合规则,搜索类场景才适合去掉锚点,只找其中一段。

第三,用真实数据验证。准备几组应该通过的输入和几组应该拒绝的输入,逐一跑一遍。特别是边界值,例如空字符串、刚好达到长度上限的输入、包含空格或特殊符号的输入,最容易暴露问题。

结语

正则表达式的核心并不复杂:字符类决定能匹配什么,量词决定出现多少次,锚点决定在什么位置匹配,分组和选择负责把这些小规则组合成大规则。掌握这四层,再对照常用模式多练几次,日常的字符串校验、提取和替换工作就会轻松很多。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。