单个字符
/y/:匹配单个字符y
/\*/:匹配*,因为*在正则中有特殊含义,但实际应用中*可以能出现在字符串中,若匹配这类特殊字符需要用转义字符 \+特殊字符 来匹配(特殊字符转义)
| 特殊字符 | 正则表达式 | 记忆法 |
|---|---|---|
| 换行符 | \n | 常用符号,很niu牛,代表很xing行,也就是hang行 |
| 换页符 | \f | fen分割,分页 |
| 回车符 | \r | re热,开车很热,开车需要热车 |
| 空白符 | \s | sha傻,脑子空白,傻白甜 |
| 制表符 | \t | tu图表,制tu图 |
| 垂直制表符 | \v | ↓箭(尖)头朝下,或者css中vertical-align文字垂直方向,垂直于地面 |
| 回退符 | [\b] | 常用路由back,如router.back(),返回,回退,使用[]符号是避免和\b(单词边界)重复 |
多个字符
/[0-9]/:匹配任意0到9
/[a-z]/:匹配任意a到z
多个字符使用中括号 []加上要匹配的多个字符表示,如[12],可同时匹配1,2,多个数组可以用范围 -表示,如 [1-5] 匹配1,2,3,4,5
| 匹配区间 | 正则表达式 | 记忆法 |
|---|---|---|
| 除了换行符之外的任何字符 | . | 类似...,表示还有其他话没说 |
| 单个数字[0-9] | \d | digit,dan单个 |
| 除了[0-9] | \D | 大写都代表非,取反,not digit |
| 包括下划线在内的单个字符[A-Za-z0-9_] | \w | word,wai外语,英文数字下划线 |
| 非单字字符 | \W | not word |
| 匹配空白字符,包括空格、制表符、换页符和换行符 | \s | sha傻,脑子空白,傻白甜,匹配所有空白字符 |
| 匹配非空白字符 | \S | not space |
循环与复用
? :匹配0个字符或1个字符(0|1),通常用于匹配两个相近的词,如匹配 css 和 scss,要保证都匹配到只需要使用 /s?css/,前面的 s 表示可有可无
*:匹配0个字符或无数个字符(>=0),通常用来过滤某些可有可无的字符串
+:匹配同个字符出现1次或多次的情况(>=1)
特定次数
{}:匹配特定的重复次数,如匹配3次y,那么使用 /y{3}/ 这个正则,或者y匹配至少两次用 /a{2,}/这个正则。
- {x}: x次
- {min, max}: 介于min次到max次之间
- {min, }: 至少min次
- {0, max}: 至多max次
| 匹配规则 | 元字符 | 记忆法 |
|---|---|---|
| 0次或1次 | ? | 问题,是否存在? |
| 0次或无数次 | * | 常用,所有,任意包含空 |
| 1次或无数次 | + | +=1,至少也是一次 |
| 特定次数 | {x}, {min, max} | 类似数学中的区间表示,[min, max] |
边界
| 边界和标志 | 正则表达式 | 记忆法 |
|---|---|---|
| 单词边界 | \b | bian边界 |
| 非单词边界 | \B | not bian边界 |
| 字符串开头 | ^ | 像不像山的顶部,代表头,开头 |
| 字符串结尾 | $ | 美元使用 $ 理解为钱可以解决(完成)大部分事 |
| 多行模式 | m标志 | max,很多,m像不像两个n,多行 |
| 忽略大小写 | i标志 | ignore case 忽略的意思 |
| 全局模式 | g标志 | global 全局 |
子表达式
- 回溯引用
回溯引用是通过反斜杠加数字(\1、\2等)引用之前捕获的分组内容,用于匹配重复模式或验证特定结构的字符串
检查连续重复的单词或数字
"hello hello".match(/(\w+)\s+\1/g); // 返回 ["hello hello"]
确保HTML标签成对出现
/<([hH][1-6])>.*?<\/\1>/.test("<h1>Heading</h1>"); // true
通过 \n 引用第 n 个分组的内容
/(\d{3})-(\d{3})-\1/.test("123-456-123"); // true(匹配第三个数字与第一个相同)
- 向前查找
(?=pattern):匹配肯定,匹配后面紧跟 pattern 的位置,但结果中不会包含 pattern
(?!pattern):匹配否定
"http://baidu.com".match(/\w+(?=:)/g); // 输出["http"]
- 向后查找
(?<=pattern):匹配肯定,匹配前面是 pattern 的位置,结果中不包含 pattern
(?<!pattern):匹配否定
"$88.88".match(/(?<=\$)\d+\.\d+/g); // 输出 ["88.88"]
| 回溯查找 | 正则 | 描述 |
|---|---|---|
| 引用 | \0,\1,\2 和 $0, $1, $2 | 转义+ 数字,匹配重复模式或验证特定结构的字符串 |
| 非捕获组 | (?:) | 仅分组,不存储匹配结果,无法回溯引用 |
| 前向查找 | (?=) | 匹配后面必须存在的 |
| 前向负查找 | (?!) | 匹配后面不能出现的 |
| 后向查找 | (?<=) | 匹配前面必须存在的 |
| 后向负查找 | (?<!) | 匹配前面不能出现的 |
逻辑操作
与、或、非是三种核心逻辑操作,用于构建复杂的匹配规则
与
默认通过连续书写子表达式实现,要求所有条件同时出现。
/cat/ // 匹配连续的字符 "c"、"a"、"t"
- 或
[]:匹配括号内任意单个字符,适用于单字符选择。
/[au]/ // 匹配 "a" 或 "u"
|:匹配多个子表达式中的任意一个,支持多字符组合
/(cat|dog)/ // 匹配 "cat" 或 "dog"
- 非
[^]:匹配不在指定集合中的字符
/[^0-9]/ // 匹配非数字字符
(?!X):右侧不能出现X
(?<!X):左侧不能出现X
/\d+(?!%)/ // 匹配数字后不跟 "%" 的情况
/(?<!-)\d+/ // 匹配不以 "-" 开头的数字
