定义

正则表达式(Regular Expression,简称 regex 或 regexp) 是一种用于匹配字符串中字符模式的工具。它由一系列字符和特殊符号组成,用来描述搜索模式

通过使用正则表达式,你可以执行复杂的字符串操作,如查找、替换、分割等

基本语法元素

普通字符:大多数字符,如字母和数字,在正则表达式中代表它们自己。例如,cat 匹配单词 “cat”

元字符:某些字符具有特殊含义,称为元字符

元字符 含义 示例
. 匹配除换行符以外的任意单个字符 a.c 匹配 abc、aXc
^ 匹配字符串的开头 ^cat 匹配以cat开头
$ 匹配字符串的结尾 cat$ 匹配以cat结尾
* 匹配前面的字符零次或多次 ab*c 匹配 ac、abc、abbc
+ 匹配前面的字符一次或多次 ab+c 匹配 abc、abbc
? 匹配前面的字符零次或一次 ab?c 匹配 ac、abc
{n} 匹配前面的字符恰好 n 次 a{3} 匹配 aaa
{n,} 匹配前面的字符至少 n 次 a{2,} 匹配 aa、aaa…
{n,m} 匹配前面的字符至少 n 次但不超过 m 次 a{2,4} 匹配 aa~aaaa

字符集:用方括号 [] 表示一个字符集合,匹配其中任何一个字符。例如,[aeiou] 匹配任何元音字母

反义字符集:用 [^...] 表示,匹配不在括号内的任意字符。例如,[^0-9] 匹配任何非数字字符

分组和捕获:用圆括号 () 将部分模式组合在一起。例如,(ab)+ 匹配一个或多个 “ab” 组合

选择:用竖线 | 分隔选项,表示”或”的关系。例如,gray|grey 匹配 “gray” 或 “grey”

量词和贪婪模式

  • 贪婪模式:默认情况下,量词 (*, +, ?, {n,m} 等) 是贪婪的,会尽可能多地匹配字符
  • 非贪婪模式:在量词后面加上 ? 可使其变为非贪婪模式,尽可能少地匹配字符。例如,.*? 匹配任意数量的字符直到遇到第一个满足条件的字符

应用场景

  • JavaScript:使用 RegExp 对象或字面量创建,使用 test(), match(), replace(), split() 等方法
  • 命令行工具:如 grep, sed, awk 等支持正则的文本处理工具
  • 编程语言:Python 的 re 模块,Java 的 java.util.regex 包等

常用简写

Java中需要 \\(字符串转义),JavaScript不需要

1
2
3
4
5
6
7
8
\d          一个数字
\D 非数字
\w 一个字母(大小写均可)、数字或下划线
\W 非字母数字下划线(特殊符号或空格)
\s 空白字符(空格或制表符Tab)
\S 非空白字符(可见符号)
. 任意一个字符(除换行符)
.... 任意四个字符

语法详解

字符集

1
2
3
4
5
6
7
8
[]          匹配其中任意一个字符
a[bcd]e a和e中间须是b或c或d其中的一个
[^] 不与中括号里的任意字符匹配
a[^bcd]e a和e中间除b、c、d外的字符都满足
[a-z] 匹配a到z之间的所有字符
a[b-d]e 等同于a[bcd]e
a[0-9]e a和e中间是一个数字,等同于a\de
a[^1-3]e a和e中间只要不是1、2、3都满足

分组与反向引用

1
2
3
4
5
(ab)+       匹配一个或多个"ab"组合
(ab|cd) 匹配ab或cd
\num num是数字,引用第num个分组的值
ab(c)d\1 对应abcdc(\1引用第一个分组c)
ab(c)(d)\1\2 对应abcdcd,等同于ab(cd)\1

选择与分组

1
2
(a|b|c)     匹配a、b或c中的一个
幸(a|b|c)运 必须幸开头运结尾,中间是a或b或c

量词详解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
?           匹配前面的子表达式零次或一次
abc?de 匹配abde(0次c)或abcde(1次c)

+ 匹配前面的子表达式一次或多次(至少1次)
abc+de ab和de之间至少有一个c

{n} 匹配确定的n次
abc{3}de ab和de之间有3个c

{n,m} 最少n次且最多m次
abc{2,3}de ab和de之间有2到3个c

* 匹配任意次(包括0次)
abc*de ab和de之间有任意个数(包括0)的c

{x|y}{n} x或y的组合出现n次
a(x|y){3}d a和d之间x和y合计3个

常用正则表达式

1
2
3
4
5
6
7
8
9
^[0-9]*$                    纯数字

[a-zA-Z]+://[^\s]* URL

^1[3-9]\d{9}$ 手机号

^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ 邮箱

^\d{15}|\d{18}$ 身份证号(15位或18位)