1. 目录
[TOC]
2. 理论知识
2.1. 基础
正则表达式是由普通字符
(例如字符 a 到 z)以及特殊字符(称为"元字符"
)组成的文字模式。
2.1.1. 普通字符
普通字符
包括没有显式指定为元字符的所有可打印和不可打印字符。这包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号。
- [A-Z] 匹配所有大写字母
- [a-z] 表示所有小写字母
- [ABC] 匹配所有的字母A或者B或者C,ABC可以换成其他字符,如aeiou匹配元音字母
- ABC 匹配所有所有不是A或者B或者C的字母,如aeiou 匹配所有非元音字母
- [0-9] 匹配某个范围内的数字,如 Chapter [3-5]匹配
Chapter 3
,Chapter 4
,Chapter 5
- [0-9]+ 匹配多个数字组成的字符串,+ 匹配一个或者多个。
.
匹配除换行符(\n、\r)之外的任何单个字符- \w 匹配字母、数字、下划线。等价于 [A-Za-z0-9_]
- \W 匹配
非字母、数字、下划线
。等价于 'A-Za-z0-9_'。
2.1.2. 非打印字符
- \n 匹配一个换行符。等价于 \x0a 和 \cJ。
- \r 匹配一个回车符。等价于 \x0d 和 \cM。return
- \s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [\f\n\r\t\v]。注意 Unicode 正则表达式会匹配全角空格符。space
- \S 匹配任何非空白字符。等价于 \f\n\r\t\v。
- \f 匹配一个换页符。等价于 \x0c 和 \cL。
- \t 匹配一个制表符。等价于 \x09 和 \cI。table
- \v 匹配一个垂直制表符。等价于 \x0b 和 \cK。verticle table
- \cx 匹配由
x
指明的控制字符。例如,\cM 匹配一个Control-M
或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。
2.1.3. 特殊字符
默认匹配有特殊含义的字符。要匹配它们自身必须在前面加上转义字符,反斜杠\
。
例如'\n' 匹配换行符,序列 \\
匹配\
, 而 \(
则匹配 (
。
$
匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则$
也匹配 '\n' 或 '\r'。要匹配 $ 字符本身,请使用\$
。( )
标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。*
匹配前面的子表达式零次或多次。+
匹配前面的子表达式一次或多次。?
匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。.
匹配除换行符 \n 之外的任何单字符。- [ 标记一个中括号表达式的开始。
- \ 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。
- ^ 匹配输入字符串的开始位置,除非在方括号表达式中使用,当该符号在方括号表达式中使用时,表示不接受该方括号表达式中的字符集合。
- { 标记限定符表达式的开始。
- | 或者,可以匹配两项任意一项。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。
2.1.4. 限定符
限定符可以表示匹配次数。如果限定符出现在范围表达式之后,则表示应用于整个范围表达式,如匹配正整数用[1-9][0-9]*
,其中[1-9]设置第一个数字不是 0,[0-9]* 表示从 0 到 9 的数字重复了0次或多次。
?
匹配文件名中的 0 个或 1 个字符*
匹配0个或多个字符。+
匹配1个或者多个。{n}
n >=0 。匹配确定的n次
。例如,o{2} 不能匹配 "Bob" 中的 o,但是能匹配 "food" 中的两个 o。{n,}
n >=0 。至少
匹配n 次。例如,o{2,} 不能匹配 "Bob" 中的 o,但能匹配 "foooood" 中的所有 o。o{1,} 等价于 o+。o{0,} 则等价于 o*。{n,m}
m 和 n 均为非负整数,其中 n <= m。最少匹配 n 次且最多匹配 m 次
。例如,o{1,3} 将匹配 "fooooood" 中的前三个 o。o{0,1} 等价于 o?。请注意在逗号和两个数之间不能有空格。
另外,* + ?
等限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?
才能实现非贪婪或最小匹配
。
例如,对于HTML的h1 标签<h1>RUNOOB-菜鸟教程</h1>
,
贪婪匹配/<.*>/
会匹配所有内容,但是加上?
后的非贪婪匹配/<.*?>/
只匹配 <h1>
。
2.1.5. 定位符
定位符用来描述字符串或单词的边界。
- ^ 匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与换行符 \n 或回车符 \r 之前的位置匹配。
$
匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与换行符 \n 或回车符 \r 之前的位置匹配。- \b 匹配一个单词边界,即字与空格间的位置。
- \B 非单词边界匹配。例如,表达式
\Bapt
匹配不出现在单词首部的字符串apt
,会匹配Chapter 中的字符串 apt,但不匹配 aptitude 中的字符串 apt。
2.1.6. 选择与反向引用
用圆括号 () 将正则表达式括起来,表示捕获相关匹配,并将其存储到一个临时缓冲区。相邻的选择项之间用 | 分隔。
所捕获的每个子匹配都按照在正则表达式模式中从左到右出现的顺序存储。缓冲区编号从 1 开始,最多可存储 99 个捕获的子表达式。每个缓冲区都可以使用 \n 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数。
例如,vscode可以用 $1
表示第一个括号匹配到的内容。
2.1.7. 表达式有前后顺序
?=、?<=、?!、?<!
- exp1(?=exp2):查找 exp2 前面的 exp1。
- (?<=exp2)exp1:查找 exp2 后面的 exp1。如匹配后面不是函数的单词
(\b\w+\b)(?=函数)
- exp1(?!exp2):查找后面不是 exp2 的 exp1。
- (?<!exp2)exp1:查找前面不是 exp2 的 exp1。
2.2. 修饰符(标记)
标记也称为修饰符,正则表达式的标记用于指定额外的匹配策略。
标记不写在正则表达式里,标记位于表达式之外/pattern/flags
- i ignore - 不区分大小写——将匹配设置为不区分大小写,搜索时不区分大小写: A 和 a 没有区别。
- g global - 全局匹配——查找所有的匹配项。
- m multi line - 多行匹配——使边界字符 ^ 和 $ 匹配每一行的开头和结尾,记住是多行,而不是整个字符串的开头和结尾。
- s 使得特殊字符圆点 . 包含换行符 \n——默认情况下的圆点 . 是匹配除换行符 \n 之外的任何字符,加上 s 修饰符之后, . 中包含换行符 \n。
2.3. 运算符优先级
正则表达式从左到右进行计算,并遵循优先级顺序。 相同优先级的从左到右进行运算,不同优先级的运算先高后低。以下从最高到最低说明其优先级顺序:
- \ —— 转义符
- (), (?:), (?=), [] —— 圆括号和方括号
- *, +, ?, {n}, {n,}, {n,m} —— 限定符
- ^, $, \ —— 任何元字符、任何字符 定位点和序列(即:位置和顺序)
- | —— 替换,"或"操作 字符具有高于替换运算符的优先级,使得"m|food"匹配"m"或"food"。若要匹配"mood"或"food",请使用括号创建子表达式,从而产生"(m|f)ood"。
3. 使用实践
3.1. 常见实例
[a-zA-Z0-9_-]+
用户名由若干个字母、数字、下划线和中划线组成<img.*?src="(.*?)".*?\/?>
匹配所有 img 标签/^(Chapter|Section) [1-9][0-9]{0,1}$/
匹配章节标题。(括号不可少,因为 | 优先级最低,要么只匹配行首的单词 Chapter,要么匹配行尾的单词 Section + 后面的数字。)[\u4E00-\u9FA5]
中文^.*(?=.{6,})(?=.*\d)(?=.*[A-Z])(?=.*[a-z])(?=.*[!@#$%^&*? ]).*$
密码强度正则,最少6位,包括至少1个大写字母,1个小写字母,1个数字,1个特殊字符^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$
邮箱,html可以VScode不行?
正则表达式 | 描述 | ||
---|---|---|---|
/\b([a-z]+) \1\b/gi |
一个单词连续出现的位置。 | ||
/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/ |
匹配一个 URL 解析为协议、域、端口及相对路径。 | ||
`/^(?:Chapter | Section) [1-9][0-9]{0,1}$/` | 定位章节的位置。 | |
/[-a-z]/ |
a 至 z 共 26个 字母再加一个 - 号。 | ||
/ter\b/ |
可匹配 chapter,而不能匹配 terminal。 | ||
/\Bapt/ |
可匹配 chapter,而不能匹配 aptitude。 | ||
`/Windows(?=95 | 98 | NT )/` | 可匹配 Windows95 或 Windows98 或 WindowsNT,当找到一个匹配后,从 Windows 后面开始进行下一次的检索匹配。 |
/^\s*$/ |
匹配空行。 | ||
/\d{2}-\d{5}/ |
验证由两位数字、一个连字符再加 5 位数字组成的 ID 号。 | ||
<[a-zA-Z]+.*?>([\s\S]*?)</[a-zA-Z]*?> |
匹配 HTML 标记。 |
正则表达式 | 描述 | ||
---|---|---|---|
hello |
匹配 {hello} | ||
`gray | grey` | 匹配 {gray, grey} | |
`gr(a | e)y` | 匹配 {gray, grey} | |
gr[ae]y |
匹配 {gray, grey} | ||
b[aeiou]bble |
匹配 {babble, bebble, bibble, bobble, bubble} | ||
`[b-chm-pP]at | ot` | 匹配 {bat, cat, hat, mat, nat, oat, pat, Pat, ot} | |
colou?r |
匹配 {color, colour} | ||
`rege(x(es)? | xps?)` | 匹配 {regex, regexes, regexp, regexps} | |
go*gle |
匹配 {ggle, gogle, google, gooogle, goooogle, ...} | ||
go+gle |
匹配 {gogle, google, gooogle, goooogle, ...} | ||
g(oog)+le |
匹配 {google, googoogle, googoogoogle, googoogoogoogle, ...} | ||
z{3} |
匹配 {zzz} | ||
z{3,6} |
匹配 {zzz, zzzz, zzzzz, zzzzzz} | ||
z{3,} |
匹配 {zzz, zzzz, zzzzz, ...} | ||
[Bb]rainf\*\*k |
匹配 {Brainf**k, brainf**k} | ||
\d |
匹配 {0,1,2,3,4,5,6,7,8,9} | ||
1\d{10} |
匹配 11 个数字,以 1 开头 | ||
`[2-9] | [12]\d | 3[0-6]` | 匹配 2 到 36 范围内的整数 |
Hello\nworld |
匹配 Hello 后跟换行符,后跟 world | ||
\d+(\.\d\d)? |
包含一个正整数或包含两位小数位的浮点数。 | ||
[^*@#] |
排除 *、@ 、# 三个特色符号 | ||
//[^\r\n]*[\r\n] |
匹配 // 开头的注释 | ||
^dog |
匹配以 "dog" 开始 | ||
dog$ |
匹配以 "dog" 结尾 | ||
^dog$ |
is exactly "dog" |
3.2. 给文档函数名加上反引号
vscode搜索框:(\b\w+\b)(\s*函数)
替换框:`$1`$2
其中,$1两边都有反引号`,网页渲染后可能会看不见
如果需要将“xxx函数”替换为“`xxx`函数”,可以使用以下正则表达式查找:
(\b\w+\b)(\s*函数)
替换:`$1`$2
解释:
(\b\w+\b): 匹配单词,使用了 b表示单词边界,w+表示一个或多个字母数字字符。
(\s*函数):匹配可能存在的空格和函数两个字。
替换部分使用了反向引用,$1表示第一个括号匹配到的内容,$2表示第二个括号匹配到的内容,并且使用了反斜线 转义反引号。使用方法:
打开要替换的文件。
按下 ctrl+H 或在菜单中选择“替换”选项在“查找”框中输入正则表达式:(\b\w+\b)(\s*函数)
在“替换为”框中输入替换字符串:`$1`$2, 点击“全部替换”按钮,完成替换。
注意:
如果有些函数名已经加了引号,那么这些函数名不会被替换。
如果要替换的内容中存在中文字符,需要使用UTF-8编码的文件格式。