正则表达式
定义语法
| 项目 | 内容 |
|---|
| 定义语法 | const 变量名 = /表达式/ |
| 说明 | 其中 / 是正则表达式字面量 |
| 示例 | const reg = /前端/ |
元字符
元字符概念
| 类型 | 说明 | 示例 |
|---|
| 普通字符 | 大多数字符只能描述它们本身,例如所有的字母和数字 | a, b, 1, 2 |
| 元字符(特殊字符) | 一些具有特殊含义的字符,可以极大提高灵活性和强大的匹配功能 | [a-z] 表示匹配所有小写字母 |
元字符分类
| 分类 | 说明 |
|---|
| 边界符 | 表示位置,开头和结尾,必须用什么开头,用什么结尾 |
| 量词 | 表示重复次数 |
| 字符类 | 比如 \d 表示 0-9 |
边界符
| 边界符 | 说明 |
|---|
^ | 表示匹配行的文本(以谁开始) |
$ | 表示匹配行的文本(以谁结束) |
说明:如果 ^ 和 $ 在一起,表示必须是精确匹配。
量词
| 量词 | 说明 |
|---|
* | 重复零次或多次 |
+ | 重复一次或多次 |
? | 重复零次或一次 |
{n} | 重复 n 次 |
{n,} | 重复 n 次或更多次 |
{n,m} | 重复 n 到 m 次 |
字符类
| 字符类 | 说明 | 示例 |
|---|
[] | 匹配字符集合,后面的字符串只要包含里面的任意字符出现都返回为 true | /[abc]/.test('andy') // true
/[abc]/.test('baby') // true
/[abc]/.test('cry') // true
/[abc]/.test('die') // false |
- | 在字符类中表示一个范围 | [a-z] 表示匹配所有小写字母
[A-Z] 表示匹配所有大写字母
[0-9] 表示匹配所有数字
[a-zA-Z0-9] 表示匹配所有字母和数字 |
修饰符
| 修饰符 | 说明 | 示例 |
|---|
i | ignore 的缩写,正则匹配时字母不区分大小写 | /a/i.test('A') // true |
g | global 的缩写,匹配所有满足正则表达式的结果 | 'ababa'.replace(/a/g, 'x') // 'xbxbx' |
语法: /表达式/修饰符
预定义字符类
| 预定义类 | 说明 | 等价于 |
|---|
\d | 匹配 0-9 之间的任意数字 | [0-9] |
\D | 匹配 0-9 以外的任意字符 | [^0-9] |
\w | 匹配任意的字母、数字和下划线 | [A-Za-z0-9_] |
\W | 匹配字母、数字、下划线以外的字符 | [^A-Za-z0-9_] |
\s | 匹配空格(包括换行符、制表符、空格符等) | [\t\r\n\v\f] |
\S | 匹配非空格的字符 | [^\t\r\n\v\f] |
常用方法
test() 方法
| 方法 | 语法 | 说明 |
|---|
| test() | regObj.test(被检测的字符串) | 用来查看正则表达式与指定的字符串是否匹配,返回布尔值 |
replace() 方法
| 方法 | 语法 | 说明 |
|---|
| replace() | 字符串.replace(正则表达式, 替换的内容) | 用来替换字符串中匹配正则表达式的部分,返回替换后的新字符串 |
高级用法:
| 功能 | 语法 | 说明 |
|---|
| 全局替换 | str.replace(/andy/g, 'baby') | 使用 g 标志进行全局替换 |
| 忽略大小写 | str.replace(/andy/i, 'baby') | 使用 i 标志忽略大小写 |
| 全局忽略大小写 | str.replace(/andy/gi, 'baby') | 同时使用 g 和 i 标志 |
| 替换所有数字 | str.replace(/\d/g, '*') | 使用 \d 匹配所有数字并替换为 * |
分组
分组概念
| 概念 | 说明 | 示例 |
|---|
| 分组 | 使用 () 可以创建分组,分组可以将多个字符作为一个整体进行处理 | /(ab)+/ 表示匹配连续出现的 ab |
| 分组捕获 | 分组会捕获匹配的内容,可以在替换时使用 $1, $2 等引用捕获的内容 | '2023-01-01'.replace(/(\d{4})-(\d{2})-(\d{2})/, '$2/$3/$1') // 结果为 '01/01/2023' |
高级用法
日期格式转换:
// 将 2023-01-01 转换为 01/01/2023
'2023-01-01'.replace(/(\d{4})-(\d{2})-(\d{2})/, '$2/$3/$1')
// 结果: '01/01/2023'
提取邮箱用户名:
// 从邮箱地址中提取用户名
'example@domain.com'.replace(/(\w+)@(\w+\.\w+)/, '$1')
// 结果: 'example'
姓名反转:
// 将 "John Doe" 转换为 "Doe, John"
'John Doe'.replace(/(\w+)\s(\w+)/, '$2, $1')
// 结果: 'Doe, John'
重复字符匹配:
// 匹配连续出现的 "ab"
/(ab)+/.test('ababab') // true
/(ab)+/.test('abc') // true
/(ab)+/.test('a') // false
非捕获分组
| 语法 | 说明 | 示例 |
|---|
(?:表达式) | 非捕获分组,不创建捕获组 | /(?:ab)+/.test('abab') // true |
嵌套分组
// 分组可以嵌套使用
'2023-01-01'.match(/(\d{4}-(\d{2})-(\d{2}))/)
// 结果: ['2023-01-01', '2023-01-01', '01', '01']
// match[0] 是完整匹配
// match[1] 是第一个分组 (\d{4}-(\d{2})-(\d{2}))
// match[2] 是第二个分组 (\d{2})
// match[3] 是第三个分组 (\d{2})