正则表达式
前言
个人感觉正则表达式用得比较多, 但是又很容易忘记, 所以写了一篇小笔记记录一些知识点, 以下内容部分来自 AI , 但是经过了我滴收集与整合和修订, 如果有误请指正哦😗
JS 正则表达式(RegEx)极简核心知识
一、定义
正则表达式是一种用于字符串模式匹配的强大工具,可快速搜索、替换、验证符合特定规则的文本。
核心目标:用简洁的语法描述复杂的字符串规则。
语法形式: p
在代码中通常用字符串表示(需注意转义符),例如:
- 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) | 数组 | 否 | 是 |
感觉整理后还是学到了不少东西哦, 希望以后能多用到
