一、关于正则的一些小技巧
1、RegExp.prototype.exec()
| 对象 | 属性/索引 | 描述 |
|---|---|---|
result | [0] | 匹配的全部字符串 |
[1], ...[*n* ] | 括号中的分组捕获 | |
index | 匹配到的字符位于原始字符串的基于0的索引值 | `4 |
input | 原始字符串 | |
re | lastIndex | 下一次匹配开始的位置 |
ignoreCase | 是否使用了 "i" 标记使正则匹配忽略大小写 | true |
global | 是否使用了 "g" 标记来进行全局的匹配. | true |
multiline | 是否使用了 "m" 标记使正则工作在多行模式(也就是,^ 和 $ 可以匹配字符串中每一行的开始和结束(行是由 \n 或 \r 分割的),而不只是整个输入字符串的最开始和最末尾处。) | false |
source | 正则匹配的字符串 |
let findDot = /\./g;
findDot.exec('13.156.4d-');
findDot.exec('13.156.4d-');
2、String.prototype.matchAll()
matchAll() 方法返回一个包含所有匹配正则表达式的结果及分组捕获组的迭代器。
let findDotMatchIterator = '13.156.4d-'.matchAll(/\./g);
findDotMatchIterator.next().value.index;
findDotMatchIterator.next().value.index;
3、RegExp.prototype.multiline
multiline 属性表明正则表达式是否使用了 "m" 标志。multiline 是正则表达式实例的一个只读属性。
/^h/g.exec('\nb\nh\nb\nb')
/^h/mg.exec('\nb\nh\nb\nb')
4、子表达式获取的值
'abcs1312das'.replace(/(\d)/g,'[$1]')
/(hello)(word)\2/.exec('hellohellowordwordhelloaacc')
5、groups
const re = /(?<year>\d{4})(\.|\/|-)(?<month>\d{2})(\.|\/|-)(?<day>\d{2})/
const match = re.exec('2021.01-20')
console.log(match.groups)
二、零宽断言
零宽断言是什么能做什么
零宽断言是正则表达式的一种方法,用于查找在某些内容(但并不包括这些内容)之前或者之后的东西,正则表达式的匹配有两种概念,一种是匹配字符,一种是匹配位置
| 表达式 | 形式 | 案例 |
|---|---|---|
| (?=pattern) | 零宽先行断言 | /x(?=y)/.exec('xy') |
| (?!pattern) | 零宽先行否定断言 | /x(?!y)/.exec('xc') |
| (?<=pattern) | 零宽后行断言 | /(?<=x)y/.exec('xy') |
| (?<!pattern) | 零宽后行否定断言 | /(?<!x)y/.exec('cy') |
先行断言
'123121231.3'.replace(/(\d)(?=(\d{3})+($|\.))/g,'$1,') //千分符
先行否定断言
/windows (?!(xp|2000))/ig.exec('Windows 10')
后行断言
'123.s.s13132.1365..5156'.replace(/(?<=\..*)[\.].*/g,'')
后行否定断言
'113dasdasd1231231asdasdadsasda'.replace(/(?<!1)[^\d].*/,'')