1. 或者 |
匹配其左右两侧,一个满足即可。
let str = "dqudwehej"
console.log(/u|@/.test(str)) //true。 str中有u或@即可。
2. 原子表() :括号的内容满足一个即可,需要加|
let str = "020-9999999"
console.log(/(010|020)\-\d{7,8}/.test(str)) //true。
//解释
(010|020): 只要有一个满足即可,满足后再继续匹配后面的\-\d{7,8}
\- :对-号进行转义
\d{7,8}: 7或8位数字
3. 原子组[] : 括号内的内容满足一个即可,不用加|
let str = "333333"
console.log(/[123]/.test(str)) //true。str中有3
[()] :()放到原子组中,就是单纯的括号,不是原子表
4. 正则表达式中的转义
- . : 除换行外的任意字符。 转义为\.
- \d: 数字字符
- /: 转义为\/
- - :转义为\- (可能不需要转义)
5. 边界约束: ^开始,$结束
let str = 'vzx23vgf32a'
console.log(/\d/.test(str)) // true \d代表数值 str中但凡有个数字就满足
console.log(/^\d/.test(str)) // false ^表示以数字开始; str = 3vgf就为true
console.log(/^\d$/.test(str)) // false ^表示以数字开始,$表示以数字结束; str = 2就为true
6. 匹配的范围和次数
- \d :匹配数字,即 0~9
- \D:除了数字
- \w :匹配数字、字母、下划线
- \W:除了数字、字母、下划线
- . :匹配除换行的所有字符
- g :全局匹配
- i :不区分大小写
- m :多行匹配(暂不管它,我用的少)
- ? :最多出现 1 次
- + :至少出现 1 次
- * :出现任意次数
- {} :分下面四种情况
- {n}代表前面的匹配符出现 n 次
- {n, m}出现次数在 n~m 之间
- {n, }至少出现 n 次
- {, m}最多出现 m 次
//全局匹配g
let str = 'bhbs_sd23-v21v-'
console.log(str.match(/\w+/g)) // [ 'bhbs_sd23', 'v21v' ]
// 用户名需求:以字母开始,后跟字母数字下划线,用户名长度在5~10位
console.log(/^[a-z]\w{4,9}$/.test('sdr7sw')) // true 因为[a-z]已经占了一位了,所以是{4,9}
7. 匹配日期
// 匹配日期,2022-02-03 和 2022/02/03 都可匹配
let str = "2022-02-03"
/*
\d{4}:前四位为数字;
[-\/]:取- 或者 /,需要对/转义为\/;
\d{2}两位数字
*/
console.log(/^\d{4}[-\/]\d{2}[-\/]\d{2}$/.test(str)) //true。
上述会出现2022/02-03匹配成功的情况,故使用\1
console.log(/^\d{4}[-\/]\d{2}\1\d{2}$/.test(str)) //true。
\1 : 前一个[]以什么分割,后一个也要一样
8. 区间匹配
let str = `2021vxfcx`
let reg = /[0-9]/g // 取到str中0-9的数 注意只能升序不能降序
console.log(str.match(reg)); // [ '2', '0', '2', '1' ]
[0-9] 等价于[0123456789]
匹配4到7位,以字母开头的字符串。该字符串可包含数字、字母、下划线;
let str = "sF_3a"
console.log(/^[a-z]\w{3,6}$/i.test(str)) //true
/*
[a-z]:以字母开头,取一位;
\w{3,6}:接下来取3~6位的字母、数字 或下划线;
i: 不区分大小写;
*/
9. 排除匹配^
let str = `2021vxfcx`
let reg = /[^vx]+/g // 除了vx其他的都匹配
console.log(str.match(reg)); // [ '2021', 'fc' ]