前言
正则表达式(Regular expressions)是用于匹配字符串中的字符组合的模板。在JavaScript 中正则表达式也是对象(Object);正则表达式拥有 exec() 和 test() 方法(在这里,方法、函数都指 function);正则表达式通常也会配合match(), matchAll(), replace(), replaceAll(), search() 和 split() 方法使用。
正则表达式变量(或常量)的创建
可以通过两种方式创建:
- 使用字面量的方式,例如
const reg01 = /a/
(用于匹配字母'a'),通过这种方式创建的好处:代码执行效率会更高;
- 使用字符串的方式创建,例如
const reg02 = new RegExp('一些')
(用于匹配文字 '一些' ),通过这种方式创建的好处:正则表达式的创建会更灵活,比如当你拿到了一个字符串变量 str 时,你不需要知道它的值是什么,也可以创建正则表达式 ;
let str = '一些'
// 使用字符串
const reg02 = new RegExp(str)
exec(str) 语法
exec 匹配字符串,返回带有 index 属性的数组
exec(str) 语法
参数:str 一个字符串
返回值:Array 一个数组,包含附加属性 { index, input, groups}
{index:'匹配到在字符串的下标',
input:'被匹配的字符串(即参数str)',
groups:'命名的捕获组'}
案例1
/** 创建正则表达式 */
// 使用字面量
const reg01 = /a/
let str = '一些'
// 使用字符串
const reg02 = new RegExp(str)
let str01 = 'There is a lesson somewhere here but I shall leave it to you to tease out.'
let str02 = '这里有一些可以学习的东西,但我把它留给你来探索。'
/** exec 匹配字符串,返回带有 index 属性的数组 */
let arr01 = reg01.exec(str01)
let arr02 = reg02.exec(str02)
// 输出匹配到的 index
console.log(arr01.index); // 9
console.log(arr02.index); // 3
该案例中,字符串1的第一个字母 a 的下标为 9(下标从0开始数);字符串2的第一个匹配项 '一些' 下标为 3,打印结果为 9 3
特殊字符
在正则表达式中有一些特殊字符,使用 \ 开头,以及* [] + ? () {}等等,这类特殊字符具有特殊含义
比如边界类特殊字符
边界类特殊字符
边界类特殊字符主要有以下4个:
| boundaries | 描述 |
|---|---|
| /^ / | 以……开头 |
| / $/ | 以……结尾 |
| \B | 非单词边界 |
| \b | 单词边界 (字母和空格之间) |
test()语法
| test(str) | 语法 |
|---|---|
| 参数 | str 待匹配的字符串 |
| 返回值 | Boolean 当字符串存在匹配项时为 true, 找不到匹配项时为 false |
案例2
let str01 = 'black cyan plum',
str02 = 'violet a white'
let str22 = '翡冷翠 冰霜银 鸢尾紫色',
str33 = '紫色 银迹 黑羽'
// \B 表示非单词边界 \b 表示单词边界(字母和空格之间的边界)
const reg01 = /\Ba\B/
// /^ / 以……开头 / $/ 以……结尾
const reg02 = /紫色$/
// test 匹配字符串,如果存在匹配项,返回 true;否则返回 false
let b01 = reg01.test(str01)
let b02 = reg01.test(str02)
let b22 = reg02.test(str22)
let b33 = reg02.test(str33)
console.log(b01); // true
console.log(b02); // false
console.log(b22); // true
console.log(b33); // false
该案例中,/\Ba\B/ 表示匹配单词中的a,但既不是单词开头的a, 也不是单词结尾处的a,因此字符串 'violet a white' 中的 a 无法被匹配,而 cyan 中的 a 被匹配; /紫色$/ 表示匹配以 '紫色' 结尾的字符串,而 '紫色 银迹 黑羽' 以紫色开头,无法被匹配