JavaScript 正则小技巧

663 阅读1分钟

一、关于正则的一些小技巧

1、RegExp.prototype.exec()

对象属性/索引描述
result[0]匹配的全部字符串
[1], ...[*n* ]括号中的分组捕获
index匹配到的字符位于原始字符串的基于0的索引值`4
input原始字符串
relastIndex下一次匹配开始的位置
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')

lookbehind

先行断言
'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].*/,'')

三、安利一个组件(输入框只能输入合法数字)

掘金地址