正则表达式基础笔记

正则表达式基础笔记

周四 5月 22 2025
1495 字 · 6 分钟

正则表达式

前言

个人感觉正则表达式用得比较多, 但是又很容易忘记, 所以写了一篇小笔记记录一些知识点, 以下内容部分来自 AI , 但是经过了我滴收集与整合和修订, 如果有误请指正哦😗

JS 正则表达式(RegEx)极简核心知识

一、定义

正则表达式是一种用于字符串模式匹配的强大工具,可快速搜索、替换、验证符合特定规则的文本。

核心目标:用简洁的语法描述复杂的字符串规则。

语法形式

  • 在代码中通常用字符串表示(需注意转义符),例如:

    • JavaScript:const regex = /pattern/flags(字面量形式)

二、核心语法: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 结尾的字符串。

三、常用符号详解

  1. 元字符(特殊功能符号)

    • []:字符类,匹配其中任意一个字符(注意是一个字符哦) 。

      [abc] 匹配 abc[A-Za-z] 匹配任意字母;[^\d] 匹配非数字(^[] 内表示取反)。

    • |:逻辑或,匹配左右任意一侧。

      cat|dog 匹配 catdoghttps? 匹配 httphttpss? 表示 s 可选)。

    • ():分组 / 捕获,用于提取匹配内容或优先处理逻辑。

      (ab)+ 匹配 ab 重复多次;(\d{3})-(\d{4}) 捕获两组数字(如 123-4567)。

  2. 转义字符

    • \ 转义特殊符号,使其作为普通字符匹配。

      \+ 匹配加号 +\( 匹配左括号 (\\ 匹配反斜杠 \

  3. 简写字符类

    符号等价于含义
    \d[0-9]数字
    \D[^0-9]非数字
    \w[A-Za-z0-9_]单词字符(字母、数字、下划线)
    \s[\t\n\r\f\v]空白字符(空格、换行等)

四、高级特性

  1. 贪婪与非贪婪匹配

    • 贪婪模式(默认):尽可能多匹配,如 a.*b 匹配 a...b 中最长的部分。
    • 非贪婪模式:加 ?,尽可能少匹配,如 a.*?b 匹配最短的 a...b
  2. 断言(零宽匹配)

    • 正向前瞻(?=pattern),匹配 pattern 前面的内容(不消耗字符)。

      abc(?=def) 匹配 abc 且后面是 def(如 abcdef 中的 abc)。

    • 负向前瞻(?!pattern),匹配 pattern 前面不是的内容。

      abc(?!def) 匹配 abc 且后面不是 def(如 abcfg 中的 abc)。

  3. 反向引用

    • ()\n(n 为分组序号),引用之前分组匹配的内容。

      (\d)\1 匹配两个连续相同数字(如 1122);(ab)\1 匹配 abab

五、典型应用场景

  1. 搜索与提取
    • 从文本中提取邮箱:\b[\w.-]+@[\w.-]+\.\w{2,}\b
    • 匹配 URL:https?://(www\.)?[a-zA-Z0-9-]+\.[a-zA-Z]{2,}
  2. 替换文本
    • 去除字符串中的所有数字:str.replace(/\d+/g, '')g 为全局匹配标志)。
    • 将驼峰命名转为下划线:str.replace(/([A-Z])/g, '_$1').toLowerCase()
  3. 验证输入
    • 手机号(中国):^1[3-9]\d{9}$
    • 密码(8-20 位,含字母 + 数字):^(?=.*\d)(?=.*[A-Za-z])[0-9A-Za-z]{8,20}$

六、注意事项

  1. 转义的双重性
    • 如果使用正则字符串,需额外转义(例 :"\\d" 表示正则中的 \d)(还是建议使用正则字面量比如 /\d/ )。
  2. 性能陷阱
    • 避免过度使用贪婪匹配和复杂分组,防止回溯爆炸(如 .* 后接复杂断言)。
  3. 测试优先

七、外部学习网站

八、附表

字符匹配

符号含义示例匹配结果
.匹配任意单个字符(除换行)a.bacb, 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\sba b, a\tb
\S匹配非空白字符\S+abc, 123
\转义特殊字符\..(句点本身)

字符类([]

符号含义示例匹配结果
[ ]匹配方括号内的任意字符[aeiou]a, e, i
[^ ]否定字符类(不匹配)[^0-9]a, @, 空格
-定义范围[a-z], [0-9A-F]b, 5, C
|或(在方括号外使用)cat|dogcat, dog

注: “ - ” 符号前后范围依据于 ASCII 码值

量词(重复匹配)

符号含义示例匹配结果
*零次或多次ab*a, ab, abbb
+一次或多次ab+ab, abbb
?零次或一次(可选)colou?rcolor, colour
{n}精确重复 n 次\d{3}123, 000
{n,}至少重复 n 次a{2,}aa, aaaa
{n,m}重复 n 到 m 次a{2,4}aa, aaa, aaaa

锚点(位置匹配)

符号含义示例匹配结果
^字符串开头^HelloHello world
$字符串结尾world$Hello world
\b单词边界\bcat\bThe cat runs
\B非单词边界\Bcat\Babcatde

分组与引用

符号含义示例匹配结果
( )捕获组(ab)+ab, abab
\1, \2反向引用捕获组(\d)\111, 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
uUnicode 模式/\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)数组

感觉整理后还是学到了不少东西哦, 希望以后能多用到


Thanks for reading!

正则表达式基础笔记

周四 5月 22 2025
1495 字 · 6 分钟