跳到主要内容

正则表达式从基础到捕获组,一篇讲清字符类量词和锚点

从字符类量词分组锚点这些正则基础讲起,带你看懂捕获组,再用手机号邮箱身份证三个真实模式练手,最后说清 g i m 三个标志各管什么,看完能自己写出能跑的正则。

发布于 作者 李雷
#正则表达式 #正则 #regex #前端 #文本处理

正则表达式从基础到捕获组,一篇讲清字符类量词和锚点

我带过几个刚转前端的同事,正则几乎是他们卡得最久的一关。不是因为它难,而是符号太密,一行 \d{3}-\d{4} 看上去像乱码。其实正则的零件很少,把字符类、量词、分组、锚点这四样拆开看,再加上捕获组和标志,常见需求基本就够用了。这篇按我自己当年理顺的顺序讲一遍。

字符类:先回答匹配什么

字符类决定一个位置能放哪些字符。最常用的几个:\d 匹配数字(等价于 [0-9]),\w 匹配字母数字下划线,\s 匹配空白(空格、制表符、换行)。大写形式取反,\D 就是非数字。方括号是自定义字符类,[abc] 匹配 a 或 b 或 c,[a-z] 是区间,[^0-9] 开头的 ^ 表示排除。

一个真实坑:从 Java 或 Python 字符串字面量里复制来的正则常带双反斜杠 \\d。在正则本体里只写一次 \d 就行,写成 \\d 反而会去匹配一个真的反斜杠。这点在 regex-tester 工具的常见错误里也专门列了出来,因为踩的人太多。

量词:回答匹配几次

量词跟在某个元素后面,控制它重复多少次。* 是零次或多次,+ 是一次或多次,? 是零次或一次。要精确控制次数就用花括号:{4} 恰好四次,{2,4} 两到四次,{3,} 三次以上。比如 \d{4} 就是连续四位数字。

量词默认贪婪,会尽量多吃。在量词后加 ? 变非贪婪,.*? 会尽量少匹配,这在抓取标签内部文本时很关键。

分组与锚点:回答边界在哪

圆括号 (...) 把若干元素组成一组,既能让量词作用于整组((ab)+ 匹配 ababab),也是捕获组的来源。锚点不消耗字符,只判断位置:^ 是行首,$ 是行尾,\b 是单词边界。想确保整段文本完全符合而不是只匹配中间一截,就用 ^$ 把模式包起来。

捕获组:把匹配到的片段单独取出来

每个圆括号是一个捕获组,从左到右按 1、2、3 编号。匹配成功后可以分别拿到这些片段,在替换里用 $1 $2 引用。比如把 2026-06-13 改成 13/06/2026,模式写 (\d{4})-(\d{2})-(\d{2}),替换填 $3/$2/$1,日月年的顺序就调过来了。我自己改代码前习惯先在 regex-tester 里把替换预览跑一遍,确认反向引用对得上,再贴回编辑器,比直接在代码里试错快很多。

如果某个括号只是为了分组、不想占编号,用 (?:...) 写成非捕获组。

三个常见模式:手机号、邮箱、身份证

中国大陆手机号是十一位,第一位固定 1,第二位是 3 到 9,后面九位任意数字。模式写成:

1[3-9]\d{9}

拿这段文本测一下:联系电话 13800138000 或 19912345678,座机 010-12345678。开 g 标志后,1380013800019912345678 两个手机号会高亮,而座机 010-12345678 不会被整段吃掉。这就是 1[3-9] 这个开头加 \d{9} 长度限制共同把关的结果。要更严就在两端加 \b 防止从更长的数字串里抠出十一位。

邮箱常用一个够用的近似式 [\w.]+@[\w.]+\.\w+,先匹配用户名,再 @,再域名,最后顶级域。要做正经的邮箱校验,别只靠一条正则,配合 邮箱格式校验工具 把边界情况一起兜住更稳。

身份证十八位是十七位数字加一位校验位,校验位可能是数字或 X,模式 \d{17}[\dXx]。正则只能管格式,最后一位的加权校验算法得靠代码补上,这点要心里有数。

标志 g i m 各管一件事

标志写在正则末尾,改变整体行为。g(global)全文找所有匹配,不开它很多引擎只返回第一个,这是新手最常忘的一个,然后纳闷为什么只高亮了一处。i(ignoreCase)忽略大小写,Regexregex 都能中。m(multiline)让 ^$ 匹配每一行的行首行尾,而不只是整段文本的开头结尾,处理多行日志时离不开它。JavaScript 还有 suy,日常前三个用得最多。

按 ECMAScript 规范,g 标志会让正则维护一个 lastIndex,所以同一个带 g 的正则对象反复调用会接着上次的位置走,这也是不少人遇到隔次匹配不上的根因,知道这条就不会再被坑。

把这套零件凑齐,大多数文本提取和清洗就能自己搞定了。模式写好别只在脑子里推演,丢进 正则测试工具 实时看高亮和捕获组,哪一段没匹配上一眼就看出来,比盯着符号干想快太多。


Made by Toolora · Updated 2026-06-13