正则表达式到底是什么

说白了,正则表达式(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

贪婪与非贪婪

正则默认是贪婪的——能多匹配就多匹配。加个 ? 就变成非贪婪(也叫惰性匹配),能少匹配就少匹配。

文本:
hello
world
贪婪:
.*
匹配:
hello
world
(一口气吃到最后) 非贪婪:
.*?
匹配:
hello
(到第一个