正则表达式到底是什么
说白了,正则表达式(Regular Expression,简称 regex)就是一段「描述字符串模式的文本」。普通的文本搜索你输入 "hello",只能找到 "hello" 这五个字母。但正则能让你表达「找所有以 h 开头、o 结尾的单词」「找所有数字」「找所有形如邮箱的字符串」——这些靠普通搜索做不到的事情。
它在实际开发里用得非常多:表单验证(手机号、邮箱格式对不对)、日志分析(从一堆日志里提取 IP 地址)、数据清洗(把文本中的日期统一格式化)、爬虫(从 HTML 里提取链接)。
很多初学者觉得正则难,其实是因为一上来就被密密麻麻的符号吓到了。但拆开来看,核心概念就那么几个。
最常用的元字符
元字符是正则里有特殊含义的符号,不是字面意思。下面这几个是最高频的,记住就够了:
| 元字符 | 含义 | 示例 |
|---|---|---|
. | 匹配任意单个字符(换行符除外) | a.c 匹配 "abc"、"a1c"、"a c" |
\d | 匹配数字(0-9) | \d\d 匹配 "42"、"07" |
\w | 匹配字母、数字、下划线 | \w+ 匹配 "hello_123" |
\s | 匹配空白字符(空格、Tab、换行) | a\sb 匹配 "a b" |
^ | 匹配字符串开头 | ^Hello 匹配行首的 "Hello" |
$ | 匹配字符串结尾 | world$ 匹配行尾的 "world" |
大写版本是反义:\D 匹配非数字,\W 匹配非单词字符,\S 匹配非空白。这个规律很好记。
量词:匹配几次
光有元字符不够,你还需要告诉正则「匹配几次」:
| 量词 | 含义 | 示例 |
|---|---|---|
* | 匹配 0 次或多次 | ab* 匹配 "a"、"ab"、"abbb" |
+ | 匹配 1 次或多次 | ab+ 匹配 "ab"、"abbb",不匹配 "a" |
? | 匹配 0 次或 1 次 | colou?r 匹配 "color" 和 "colour" |
{n} | 精确匹配 n 次 | \d{4} 匹配 4 位数字 |
{n,m} | 匹配 n 到 m 次 | \d{2,4} 匹配 2-4 位数字 |
字符集合和范围
方括号 [] 表示「匹配方括号里的任意一个字符」:
[aeiou] 匹配任意一个元音字母
[a-z] 匹配任意小写字母
[A-Za-z0-9] 匹配字母和数字
[^0-9] 匹配非数字(^ 在方括号内表示"排除")
注意 ^ 在方括号外面是「行首」,在方括号里面(紧跟左括号)是「排除」,含义完全不同,别搞混。
分组与捕获
用圆括号 () 可以把一部分正则括起来当成一个整体,还能把匹配到的内容「捕获」出来用:
(\d{4})-(\d{2})-(\d{2})
匹配 2026-07-03:
第1组 (\\d{4}) 捕获 "2026"
第2组 (\\d{2}) 捕获 "07"
第3组 (\\d{2}) 捕获 "03"
在 JavaScript 里用 match[1]、match[2] 取出各组内容。在替换里可以用 $1、$2 引用:
"2026-07-03".replace(/(\d{4})-(\d{2})-(\d{2})/, "$3/$2/$1")
// 结果:03/07/2026
贪婪与非贪婪
正则默认是贪婪的——能多匹配就多匹配。加个 ? 就变成非贪婪(也叫惰性匹配),能少匹配就少匹配。
文本:helloworld
贪婪:.*
匹配:helloworld(一口气吃到最后)
非贪婪:.*?
匹配:hello(到第一个