正则表达式
前言
个人感觉正则表达式用得比较多, 但是又很容易忘记, 所以写了一篇小笔记记录一些知识点, 以下内容部分来自 AI , 但是经过了我滴收集与整合和修订, 如果有误请指正哦😗
JS 正则表达式(RegEx)极简核心知识
一、定义
正则表达式是一种用于字符串模式匹配的强大工具,可快速搜索、替换、验证符合特定规则的文本。
核心目标:用简洁的语法描述复杂的字符串规则。
语法形式:
在代码中通常用字符串表示(需注意转义符),例如:
- JavaScript:
const regex = /pattern/flags
(字面量形式)
- JavaScript:
二、核心语法:3 类基础符号
类别 | 符号 / 语法 | 示例与含义 |
---|---|---|
字符匹配 | 普通字符、\. (任意单个字符) | a 匹配 a ;\. 匹配点号;\d 匹配数字(等价于 [0-9] )。 |
量词 | * (0 + 次)、+ (1 + 次)、? (0 或 1 次)、{n} (n 次)、{n,m} (n 到 m 次) | a+ 匹配 1 个或多个 a ;\d{3} 匹配 3 位数字;[A-Za-z]? 匹配 0 或 1 个字母。 |
边界符 | ^ (行首)、$ (行尾)、\b (单词边界) | ^hello 匹配以 hello 开头的字符串;world$ 匹配以 world 结尾的字符串。 |
三、常用符号详解
元字符(特殊功能符号)
[]
:字符类,匹配其中任意一个字符(注意是一个字符哦) 。✅
[abc]
匹配a
、b
、c
;[A-Za-z]
匹配任意字母;[^\d]
匹配非数字(^
在[]
内表示取反)。|
:逻辑或,匹配左右任意一侧。✅
cat|dog
匹配cat
或dog
;https?
匹配http
或https
(s?
表示s
可选)。()
:分组 / 捕获,用于提取匹配内容或优先处理逻辑。✅
(ab)+
匹配ab
重复多次;(\d{3})-(\d{4})
捕获两组数字(如123-4567
)。
转义字符
用
\
转义特殊符号,使其作为普通字符匹配。✅
\+
匹配加号+
;\(
匹配左括号(
;\\
匹配反斜杠\
。
简写字符类
符号 等价于 含义 \d
[0-9]
数字 \D
[^0-9]
非数字 \w
[A-Za-z0-9_]
单词字符(字母、数字、下划线) \s
[\t\n\r\f\v]
空白字符(空格、换行等)
四、高级特性
贪婪与非贪婪匹配
- 贪婪模式(默认):尽可能多匹配,如
a.*b
匹配a...b
中最长的部分。 - 非贪婪模式:加
?
,尽可能少匹配,如a.*?b
匹配最短的a...b
。
- 贪婪模式(默认):尽可能多匹配,如
断言(零宽匹配)
正向前瞻:
(?=pattern)
,匹配pattern
前面的内容(不消耗字符)。✅
abc(?=def)
匹配abc
且后面是def
(如abcdef
中的abc
)。负向前瞻:
(?!pattern)
,匹配pattern
前面不是的内容。✅
abc(?!def)
匹配abc
且后面不是def
(如abcfg
中的abc
)。
反向引用
()\n
(n 为分组序号),引用之前分组匹配的内容。✅
(\d)\1
匹配两个连续相同数字(如11
、22
);(ab)\1
匹配abab
。
五、典型应用场景
- 搜索与提取
- 从文本中提取邮箱:
\b[\w.-]+@[\w.-]+\.\w{2,}\b
- 匹配 URL:
https?://(www\.)?[a-zA-Z0-9-]+\.[a-zA-Z]{2,}
- 从文本中提取邮箱:
- 替换文本
- 去除字符串中的所有数字:
str.replace(/\d+/g, '')
(g
为全局匹配标志)。 - 将驼峰命名转为下划线:
str.replace(/([A-Z])/g, '_$1').toLowerCase()
- 去除字符串中的所有数字:
- 验证输入
- 手机号(中国):
^1[3-9]\d{9}$
- 密码(8-20 位,含字母 + 数字):
^(?=.*\d)(?=.*[A-Za-z])[0-9A-Za-z]{8,20}$
- 手机号(中国):
六、注意事项
- 转义的双重性
- 如果使用正则字符串,需额外转义(例 :
"\\d"
表示正则中的\d
)(还是建议使用正则字面量比如 /\d/ )。
- 如果使用正则字符串,需额外转义(例 :
- 性能陷阱
- 避免过度使用贪婪匹配和复杂分组,防止回溯爆炸(如
.*
后接复杂断言)。
- 避免过度使用贪婪匹配和复杂分组,防止回溯爆炸(如
- 测试优先
- 用在线工具(如 RegExr↗、Regex Learn↗)验证正则逻辑,再嵌入代码。
七、外部学习网站
八、附表
字符匹配
符号 | 含义 | 示例 | 匹配结果 |
---|---|---|---|
. | 匹配任意单个字符(除换行) | a.b | acb , a1b , a@b |
\d | 匹配数字(等价于 [0-9] ) | \d{3} | 123 , 007 |
\D | 匹配非数字(等价于 [^0-9] ) | \D+ | abc , @! |
\w | 匹配单词字符(字母、数字、下划线) | \w{5} | hello , a1_b2 |
\W | 匹配非单词字符 | \W+ | @# $ , 空格 |
\s | 匹配空白字符(空格、制表符、换行等) | a\sb | a b , a\tb |
\S | 匹配非空白字符 | \S+ | abc , 123 |
\ | 转义特殊字符 | \. | . (句点本身) |
字符类([]
)
符号 | 含义 | 示例 | 匹配结果 |
---|---|---|---|
[ ] | 匹配方括号内的任意字符 | [aeiou] | a , e , i |
[^ ] | 否定字符类(不匹配) | [^0-9] | a , @ , 空格 |
- | 定义范围 | [a-z] , [0-9A-F] | b , 5 , C |
| | 或(在方括号外使用) | cat|dog | cat , dog |
注: “ - ” 符号前后范围依据于 ASCII 码值
量词(重复匹配)
符号 | 含义 | 示例 | 匹配结果 |
---|---|---|---|
* | 零次或多次 | ab* | a , ab , abbb |
+ | 一次或多次 | ab+ | ab , abbb |
? | 零次或一次(可选) | colou?r | color , colour |
{n} | 精确重复 n 次 | \d{3} | 123 , 000 |
{n,} | 至少重复 n 次 | a{2,} | aa , aaaa |
{n,m} | 重复 n 到 m 次 | a{2,4} | aa , aaa , aaaa |
锚点(位置匹配)
符号 | 含义 | 示例 | 匹配结果 |
---|---|---|---|
^ | 字符串开头 | ^Hello | Hello world |
$ | 字符串结尾 | world$ | Hello world |
\b | 单词边界 | \bcat\b | The cat runs |
\B | 非单词边界 | \Bcat\B | abcatde |
分组与引用
符号 | 含义 | 示例 | 匹配结果 |
---|---|---|---|
( ) | 捕获组 | (ab)+ | ab , abab |
\1 , \2 | 反向引用捕获组 | (\d)\1 | 11 , 22 |
(?: ) | 非捕获组(不存储) | (?:ab)+ | ab , abab |
断言(零宽匹配)
符号 | 含义 | 示例 | 匹配结果 |
---|---|---|---|
(?= ) | 正向先行断言(后面必须是) | \d+(?= dollars) | 100 in 100 dollars |
(?! ) | 负向先行断言(后面不能是) | \d+(?! dollars) | 100 in 100 yen |
(?<= ) | 正向后行断言(前面必须是) | (?<=\$)\d+ | 100 in $100 |
(?<! ) | 负向后行断言(前面不能是) | (?<!\$)\d+ | 100 in ¥100 |
标志符(附于正则表达式后, 影响搜索结果)
标志 | 含义 | 示例 |
---|---|---|
g | 全局匹配(查找所有) | /\d/g |
i | 忽略大小写 | /apple/i |
m | 多行模式(^ 和 $ 匹配行首 / 行尾) | /^line/m |
s | 允许 . 匹配换行符 | /a.b/s |
u | Unicode 模式 | /\u{1F600}/u |
y | 粘连模式(从 lastIndex 开始匹配) | /\d/y |
方法对比
方法 | 返回值类型 | 是否含捕获组 | 是否全局匹配 |
---|---|---|---|
regex.test(str) | boolean | 否 | 否 |
regex.exec(str) | 数组或 null | 是 | 是(需 g ) |
str.match(regex) | 数组或 null | 部分情况 | 是(需 g ) |
str.matchAll(regex) | 迭代器 | 是 | 必须 g |
str.search(regex) | 位置(number ) | 否 | 否 |
str.replace(regex, replacement) | 替换后的字符串 | 是 | 是(需 g ) |
str.split(regex) | 数组 | 否 | 是 |
感觉整理后还是学到了不少东西哦, 希望以后能多用到