正则进阶
更新时间:2023-12-13阅读整篇大约6分钟
捕获分组
通过()
来创建一个分组
js
const str = 'some?content 123 abababcacb .md .txt .js .ts'
const pattern = /(\w+)\?(\w+)\s*.*(\.md)/;
str.match(pattern)//['some?content 123 abababcacb .md','some','content', '.md',];//第0索引表示整个正则匹配模式匹配到的字符,第1个索引开始就表示各个分组所匹配到的内容
通过静态属性访问分组
js
const str = 'some?content 123 abababcacb .md .txt .js .ts'
const pattern = /(?<custom_name_1>\w+)\?(?<custom_name_2>\w+)\s*.*(\.md)/;
str.match(pattern)
console.log(RegExp.$1);//some
自定义分组名
js
const str = 'some?content 123 abababcacb .md .txt .js .ts'
const pattern = /(?<custom_name_1>\w+)\?(?<custom_name_2>\w+)\s*.*(\.md)/;
str.match(pattern)
/**
[
...,
groups:{
custom_name_1: 'some',
custom_name_2: 'content'
}
]
* */
解构
js
const str = 'some?content 123 abababcacb .md .txt .js .ts'
const pattern = /(?<custom_name_1>\w+)\?(?<custom_name_2>\w+)\s*.*(\.md)/;
const group = pattern.exec(str);// =>等于match的groups
const [custom_name_1,custom_name_2] = group;
反向引用
js
const str = 'some?content 123 abababcacb .md .txt .js .ts';
const pattern = /(?<custom_name_1>ab)\1\k<custom_name_1>/;//\1和\k<custom_name_1>,以前的 capture group 会用 \1, \2 来 back reference, 同理 named group 也一样可以, 语法是 \k<name>
console.log(pattern.exec(str)); // =>等于match的groups
//['ababab', 'ab',index: 17,input: 'some?content 123 abababcacb .md .txt .js .ts', groups: [Object: null prototype] { custom_name_1: 'ab' }]
非捕获分组
通过(?:pattern)
来创建一个非捕获分组
js
const str = 'some?content 123 abababcacb .md .txt .js .ts'
const pattern = /(?:\w+)\?(?:\w+)\s*.*(\.md)/;
str.match(pattern)//['some?content 123 abababcacb .md','.md', index: 0,input: 'some?content 123 abababcacb .md .txt .js .ts',groups: undefined]
前瞻
正向前瞻
使用(?=pattern)
来进行正向前瞻
前瞻和后顾只会去匹配位置,不会匹配文本,也就是是否存在一个字符串位置,满足正则模式
正向可以理解为等于
前瞻
(?=pattern)
:从一个位置往匹配方向的前方看,或者往匹配方向的正向看,或者顺着匹配方向看。去看这个位置 前方(右侧) 的字符是否等于pattern。
123456789,如果是(?=456),那么789(右)是前,123(左)是后
js
//匹配密码(必须有大写小写字母,以及数字,8位以上)
const str = 'asdASD123'
const pattern = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$/;//匹配会站在某个位置去进行匹配,对于多个前瞻,都会站在同一个位置去匹配
pattern.test(str)
const str = 'asdASD123';
const pattern = /.*(?=ASD)/g; //匹配会站在某个位置去进行匹配,对于多个前瞻,都会站在同一个位置去匹配
console.log(str.match(pattern));//[ 'asd', '' ]
负向前瞻
负向可以理解为不等于
负前瞻
(?!pattern)
:从一个位置往匹配方向的前方看,或者往匹配方向的正向看,或者顺着匹配方向看。在当前位置向前查找,确保接下来的文本不匹配pattern
。如果匹配成功,则当前位置不会被视为匹配项,继续向后匹配
js
const strs = ['123abc', '12abcd', '123abcd', '13456abc', 'Aa2dadasdasdxabca'];
const pattern = /^(?!123).*(?=abc$)/;//不以123开头并且以abc结尾
strs.forEach(str => {
console.log(pattern.test(str));
});
后顾
正向后顾
使用(?<=pattern)
来进行正向后顾
js
//匹配以特定字符开头
const str = '2312asdASD123'
const pattern = /(?<=asd).*/;
pattern.test(str)
负向后顾
使用(?<!pattern)
来进行负向后顾
js
// 匹配不是以123开头的abc
const regex = /(?<!123)abc/g;
console.log(regex.test("abc123")); // true
console.log(regex.test("123abc")); // false
常用的正则表达式
数字校验相关
- 校验整数:
/^-?\d+$/
- 校验正整数:
/^\d+$/
- 校验负整数:
/^-\d+$/
- n位的数字:
/^\d{n}$/
- m-n位的数字:
/^\d{m,n}$/
- 校验浮点数:
/^-?\d+(\.\d+)?$/
- 校验正浮点数:
/^\d+(\.\d+)?$/
- 校验负浮点数:
/^-\d+(\.\d+)?$/
- 校验数字字符串:
/^\d+$/
- 校验百分比(0-100之间的数字):
/^([1-9]\d?|100)$/
字符校验相关
- 校验英文字母:
/^[a-zA-Z]+$/
- 校验大写英文字母:
/^[A-Z]+$/
- 校验小写英文字母:
/^[a-z]+$/
- 校验数字和英文字母组合:
/^[a-zA-Z0-9]+$/
- 校验数字、英文字母和下划线组合:
/^\w+$/
- 校验中文字符:
/^[\u4e00-\u9fa5]+$/
特殊需求
- 匹配手机号码:
/^1[3456789]\d{9}$/
- 匹配邮箱地址:
/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/
- 匹配URL地址:
/^(http|https):\/\/[^\s]+$
- 匹配身份证号码(18位):
/^\d{17}[\dXx]$/
- 匹配日期(YYYY-MM-DD):
/^\d{4}-\d{2}-\d{2}$/
- 匹配IP地址:
/^((25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|[1-9])\.){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|[1-9])$/
- 匹配邮政编码:
/^[1-9]\d{5}$/
- 匹配整数:
/^-?\d+$/
- 匹配浮点数:
/^-?\d+(\.\d+)?$/
- 匹配英文单词:
/^[a-zA-Z]+$/
- 匹配中文字符:
/^[\u4e00-\u9fa5]+$/
- 匹配用户名(字母开头,允许字母、数字、下划线,长度为6-16位):
/^[a-zA-Z]\w{5,15}$/
- 匹配密码(包含大小写字母和数字,长度为6-20位):
/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{6,20}$/
- 匹配HTML标签:
/<\/?[^>]+>/
- 匹配16进制颜色值:
/^#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})$/
- 匹配QQ号码:
/^[1-9]\d{4,10}$/
- 匹配微信号(以字母开头,允许字母、数字、下划线,长度为6-20位):
/^[a-zA-Z]([-_a-zA-Z0-9]{5,19})+$/
- 匹配车牌号(普通车牌和新能源车牌):
/^(京|津|沪|渝|冀|豫|云|辽|黑|湘|皖|鲁|新|苏|浙|赣|鄂|桂|甘|晋|蒙|陕|吉|闽|贵|粤|青|藏|川|宁|琼)([A-HJ-NP-Z]{1}(([0-9]{5}[DF])|([DF][A-HJ-NP-Z0-9][0-9]{4})))$/
- 匹配MAC地址:
/^([0-9A-Fa-f]{2}[:-]){5}[0-9A-Fa-f]{2}$/
- 匹配中国大陆固定电话号码:
/^0\d{2,3}-\d{7,8}$/