目录
一、创建正则对象
1. 使用RegExp构造函数 new RegExp()
- 参数情况一:new RegExp(‘word’,‘ig’);
- 参数情况二:new RegExp(/word/ig);
代码示例:
const reg = new RegExp(/word/ig);
const reg1 = new RegExp('word','ig');
//相当于const reg = /word/ig;
2. 直接声明变量
代码示例:
//写法:/匹配要求/修饰符
const reg = /word/ig;
二、修饰符
1.u 修饰符
匹配大于\uFFFF的Unicode字符,可以正确处理4个字符的UTF-16编码
- 使用大括号{ }表示Unicode字符时要使用u修饰符才能正确匹配
- 在量词中匹配正确的字符
- 点 ( . ) 匹配除换行符以外的Unicode字符,使用u修饰符就可以匹配大于\uFFF的Unicode字符,比如中文字符
在更新的标准中除使用{}表示Unicode字符外不使用u修饰符也能正确匹配字符
代码示例:
console.log(/\u597D/u.test('\u597D'));//true
console.log(/\u597D/.test('\u597D'));//true
console.log(/\u597D/u.test('好'));//true
console.log(/\u597D/.test('好'));//true
//es6新增使用{}表示Unicode字符表示法
console.log(/\u{597D}/u.test('好'));//true
console.log(/\u{597D}/.test('好'));//false
//量词中匹配正确的字符
console.log(/好{2}/u.test('好好'));//true
console.log(/好{2}/.test('好好'));//true
2.g 修饰符 全局匹配
3.y 修饰符
也是全局匹配,但是跟g修饰符的区别在于:y修饰符隐含了头部匹配的标志(^),让(^)在全局匹配中都有效
代码示例:
const strY = 'besbdebls';
let rY = /b/y;
let rG = /b/g;
console.log(rY.exec(strY));//b index:0
//因为上一个匹配位置是0,所以下一个位置是1,为e,不符合匹配返回null
console.log(rY.exec(strY));//null
//exec()返回null后重新从0开始
console.log(rY.exec(strY));//b index:0
const strY2 = 'bbesbbdebls';
console.log(rY.exec(strY2));//b index:0
console.log(rY.exec(strY2));//b index:1
console.log(rY.exec(strY2));//null
console.log(rY.exec(strY2));//b index:0
console.log(rY.exec(strY2));//b index:1
console.log(rY.exec(strY2));//null
//g修饰符跳过不符合,返回符合匹配,直到没有字符匹配返回null再重新从0开始匹配
console.log(rG.exec(strY));//b index:2
console.log(rG.exec(strY));//b index:5
console.log(rG.exec(strY));//b index:6
console.log(rG.exec(strY));//null
console.log(rG.exec(strY));//b index:0
console.log(rG.exec(strY));//b index:3
4.s 修饰符
(.) 点匹配除行终止符的任意单个字符,使用s修饰符后点 (.) 就可以匹配包括行终止符的任意单个字符,即点(dot)为所有字符,dotAll模式 (提示: 行终止符指换行符U+000A或\n、回车符U+000D或\r、行分隔符U+2028、段分隔符U+2029)
代码示例:
console.log('macth\n222\r'.match(/./gs));// ['m', 'a', 'c', 't', 'h', '\n', '2', '2', '2', '\r']
console.log('macth\n333\r'.match(/./g));// ['m', 'a', 'c', 't', 'h', '3', '3', '3']
5.i 修饰符
不分大小写字母匹配字符
代码示例:
const reg4 = /word/i;
reg4.test('WorD');//true
reg4.test('word');//true
三、正则对象属性
- flags: 返回String值,表示正则对象使用的修饰符
- dotAll: 返回Boolean值,表示正则对象是否使用了s修饰符
- sticky: 返回Boolean值,表示正则对象是否使用了y修饰符
- exec(): 在一个指定字符串中执行一个搜索匹配。返回一个结果数组或 null
代码示例:
//exec()必须使用g修饰符或y修饰符才能从上一个匹配的位置开始匹配,要不然一直返回第一匹配字符
const test = 'abcd';
let testReg = /\w/g;
console.log(testReg.exec(test));//a
console.log(testReg.exec(test));//b
console.log(testReg.exec(test));//c
console.log(testReg.exec(test));//d
console.log(testReg.exec(test));//null
//返回null后就从0重新开始
console.log(testReg.exec(test));//a
//使用regObj.lastIndex改变下一个匹配开始的位置
testReg.lastIndex = 2;//从2开始,也就是c开始
console.log(testReg.exec(test));//c
四、先行断言与后行断言
- 先行断言
- 先行断言:/x(?=y)/ x只有在y前面才匹配
- 先行否定断言:/x(?!y)/ x只有不在y前面才匹配
代码示例:
//只有在@前面的 字符 才匹配
console.log('jack@qq.com lin@qq.com'.match(/\w+(?=@)/g);//['jack','lin']
- 后行断言
- 后行断言:/(?<=y)x/ x只有在y后面才匹配V8引擎的4.9版本支持
- 后行否定断言:/(?<!y)x/ x不在y后面才匹配
代码示例:
//匹配不在元后面的 数字
console.log('水蜜桃10元三斤便宜卖啦!'.match(/(?<!元)\d+/ug));//['10']
五、正则中的特殊字符
- \d :数字
- \D:不是数字,空格、行终止符、大于\uFFFF的Unicode字符(中文)
- \w:字母
- \W:不是字母,空格、行终止符、大于\uFFFF的Unicode字符(中文)
- \s:空格
- \S:除空格外的字符,空格、大于\uFFFF的Unicode字符、特殊字符%¥&
- (.) 点:匹配除换行符之外的任意字符
- \ :匹配 \
- ^ :行的开头
- & :行的结尾
六、表示次数
正确的使用 量词 和 ?* + 表示不确定数量的字符
- ? :零次或一次
- *:零次或多次
- +:一次或多次
- 使用量词{num}表示出现的次数
代码示例:
//在匹配字符后使用表示字符重复的次数
/a?/;//零个a或一个a
/a*/;//零个a或多个a
/a+/;//一个a或多个a
//使用量词表示上限和下限
//匹配两个a到四个a
const str = '_aa_aaaaaa_aaa';
console.log(str.match(/a{2,4}/g));//['aa','aaaa','aa','aaa']
//匹配四个a
console.log(str.match(/a{4}/g));//['aaaa']
七、应用正则对象
regObj.test(strObj)
测试str字符串是否满足要求,返回Boolean值
strObj.match(regObj)
返回字符串中符合匹配的数组结果
strObj.replace(regObj,str)
搜索并替换,将字符串中符合匹配的字符串转换为指定字符 str
未完待续......