正则表达式是一种文本模式,通过特殊的字符组合成一个规则。通过它可以匹配、截取、替换符合这个规则的字符串。
声明正则表达式
正则表达式声明方式为两种:
字面量
// 一般采用这种方式
const reg = /0/
构造函数
// 如果需要动态生成正则,就采用这哥方式
const reg = new RegExp('0')
字符串匹配
RegExp.prototype.test
// 包含 '0'
const reg = /0/;
console.log(reg.test('aa')); // false
console.log(reg.test('a0')); // true
// 包含 'abc'
const reg1 = /abc/
console.log(reg1.test('aabbcc')) // false
console.log(reg1.test('aabcc')) // true
元字符和限定符
正则中的特殊字符分为 元字符、限定符,通过这些特殊字符来表示出复杂匹配规则和含义。
字符类
字符 | 作用 |
---|---|
x | y | 匹配 x 或 y 任意字符 |
[] | [ ] 整体用来匹配一位字符,[ ]内部代表当前位置的多种情况 |
() | ()内部代表一个整体,他在操作多个字符时非常常用 |
// | 示例
// 匹配字符串中包含 'abc' 或 'ac'
const reg = /abc|ac/
reg.test('aabbcc') // false
reg.test('abd') // false
reg.test('abcd') // true
reg.test('acd') // true
reg.test('a') // false
// [] 示例
// 匹配字符串中包含 'a' 或 'b' 或 'c'
const reg = /[abc]/
reg.test('aabbcc') // true
reg.test('cba') // false
// () 示例
// 匹配字符串中包含 'abc'
const reg = /(abc)/
reg.test('aabbcc') // false
reg.test('bacbabc') // true
反向类
字符 | 作用 |
---|---|
^ | 将^书写在 [ ] 内开始位置,代表反向类;他表示 内部字符以外的其他字符 可以匹配成功 |
const reg = /[^abc]/
reg.test('abc') // false
reg.test('ac') // false
reg.test('b') // false
reg.test('ad') // false
reg.test('dd') // true
范围类
字符 | 作用 | 常见形式 |
---|---|---|
[字符-字符] | 形式为[ 字符-字符 ],用来表示这个位置字符可匹配的范围 | [0-9] [a-z] [A-Z] |
const reg = [0-3] // 等同于 [0123]
reg.test('2a') // true
组合类
作用 | 常见形式 |
---|---|
[]内可书写多个范围组合形式 | [0-9a-zA-Z] [0-3a-c] |
const reg = [0-3b-g] // 等同于 [0123bcdefg]
预定义类
预定义类是正则内置的一些匹配规则
字符 | 作用 | 备注 |
---|---|---|
\ | 转义字符,它主要有两个功能: 1、让普通字符具有特殊功能 2、去除特殊字符的功能,让其变为普通字符 | |
\d | 匹配数字字符 | |
\D | 匹配非数字字符(了解) | |
\w | 匹配单词字符 | 包含: 1、数字 2、 _ (下划线)3、大小写英文字母字符 |
\i | 匹配英文字母字符(不区分大小写) | |
\W | 匹配非单词字符 | 除大小写英文字符、数字、_ (下划线)以外的字符 |
\s | 匹配所有空白字符,换行、空格、制表符等不可见的空白符 | |
\S | 匹配可见字符(了解) | |
. | 匹配除换行符(\n 、\r )以外的任何单个字符(了解) | 如果要匹配. 本身,需要通过转义符对. 进行转义(\. ) |
边界词
字符 | 使用方式 | 作用 | 备注 |
---|---|---|---|
^ | 在正则表达式开始位置书写^ | 代表字符串开始位置,必须以指定内容开始,才能匹配成功 | |
$ | 在正则表达式结束位置书写$ | 代表字符串结束位置,必须以指定内容结束,才能匹配成功 | |
同时使用^和$ | 在正则开始位置书写^ ,在正则结束位置书写$ | 代表着严格匹配,字符串中除了含有匹配成功部分之外,不能含有其他内容 |
// ^ 示例
// 以0-3开头且第二位为4
const reg = /^[0-3]4/
reg.test('3') // false
reg.test('345') // true
// $ 示例
// 以倒数第二位为0-3,最后一位为4结尾
const reg = /[0-3]4$/
reg.test('3') // false
reg.test('345') // false
reg.test('334') // true
// ^ + $ 示例
// 进行严格匹配,一共三位字符,第一位字符为0-3,第二位字符为4,最后一位字符为a-c
const reg = /^[0-3]4[a-c]$/
量词
自定义量词
字符 | 功能 | 备注 |
---|---|---|
{n} | 前面的字符需要连续出现n次 | /a{2}/:a字符需要连续出现两次 |
{n,m} | 前面的字符连续出现次数需要在某个范围内 | /a{2,5}/:a字符连续出现次数在2-5之间 |
{n,} | 前面的字符连续出现次数至少n次 | /a{2,}/:a字符至少连续出现2次 |
// 1需要连续出现三次
const reg = /01{3}/
reg.test('011011010100') // false
reg.test('010101011') // false
reg.test('010111') // true
// 01需要连续出现三次
// ()的内容会作为一个整体
const reg = /(01){3}/
reg.test('010100011') // false
reg.test('010110111') // false
reg.test('11010101') // true
// 01需要连续出现3-4次
const reg = /(01){3,4}/
reg.test('0101') // false
reg.test('010101') // true
reg.test('0101010101') // true
预定义量词
字符 | 功能 | 备注 |
---|---|---|
+ | 前面字符至少出现一次 | |
* | 前面字符至少出现0次 | 等于字符可有可无,适用于可选的内容部分 |
? | 代表前面字符出现0次或1次 |
字符串替换
语法 | 参数 | 备注 |
---|---|---|
String.prototype.replace(RegExp,String) | RegExp:匹配规则的正则表达式 String:字符串,替换的内容 | |
String.prototype.replace(RegExp,replaceHandler) | RegExp:匹配规则的正则表达式 replaceHandler:函数,用来处理替换的内容 | replaceHandler会接收一个参数,这个参数为匹配成功的内容,replaceHandler的返回值来作为替换的内容 |
// 字符串替换 默认只会替换第一个符合规则的字符,如果需要替换所有符合规则的字符串,可以添加匹配模式
// String.prototype.replace(RegExp,String)
const colors = '红绿绿绿蓝红绿红红'
const replacedColors = colors.replace(/绿/,'白')
console.log('colors',replacedColors) // colors 红白绿绿蓝红绿红红
// String.prototype.replace(RegExp,function (matchedString) {})
// 如果第二个参数为函数,则这个函数的参数为匹配成功的内容,并且函数的返回值会替换这个部分
const colors = '红绿绿绿蓝红绿红红'
const replacedColors = colors.replace(/绿|蓝/g,function (matchedString) {
console.log('matchedString',matchedString)
if(matchedString === '绿' ) return '白'
if(matchedString === '蓝' ) return '黑'
})
console.log('replacedColors',replacedColors) // replacedColors 红白白白黑红白红红
匹配模式
字符 | 作用 | 备注 |
---|---|---|
g | 全局匹配,找到所有符合规则的内容 | |
i | 忽略大小写,找到所有符合规则的字母无论大小写 |
const data = 'a1b2C3Cc4'
// 单个匹配模式
data.replace(/\d/g,'-')
// 多个匹配模式
data.replace(/\d/gi,'-')
// 通过构造函数
const Reg = new RegExp('\d','gi')
data.replace(Reg,'-')
字符串提取
String.prototype.match(reg)
-
参数
reg:正则表达式,用来检索匹配字符串 -
返回值
found:数组,包含正则检索结果。如果正则开启全局匹配则可以获取所有提取结果,如果未开启全局匹配就会返回捕获组,捕获组会包含成员属性index、groups、input。- index:被提取出的字符
- groups:捕获组数组或undefined
- input:被匹配的原字符串
// 未开启全局匹配
const str = 'a1b2c3d4e5f6g7h8i9'
const found = str.match(/\d/)
console.log('found',found);
// 开启全局匹配
const str = 'a1b2c3d4e5f6g7h8i9'
const found = str.match(/\d/g)
console.log('found',found);
RegExp.prototype.exec(string)
-
参数
string:字符串,待匹配的字符串 -
返回值
result:数组或null,方匹配成功时返回数组,否则返回null
正则每次匹配成功时,就会将匹配成功的位置记录在lastIndex属性中。当正则和被匹配字符串不变的情况下,每次调用exec匹配成功就会更新lastIndex,为下次匹配做准备。这样我们可以遍历每次匹配结果
const reg = /\d/g
const str = 'a1b2c3d4e5f6g7h8i9'
let result
while((result = reg.exec(str))!==null) {
console.log('result',result);
}