正则校验
正则表达式基本组成部分
元字符
| 元字符 | 描述 |
|---|---|
. | 匹配除换行符以外的任何单个字符。 |
* | 匹配前面的子表达式零次或多次。 |
+ | 匹配前面的子表达式一次或多次。 |
? | 匹配前面的子表达式零次或一次。 |
^ | 匹配输入字符串的开始位置。 |
$ | 匹配输入字符串的结束位置。 |
| | 表示“或”操作。 |
[] | 定义字符集。 |
() | 定义一个子表达式。 |
量词
| 量词 | 描述 |
|---|---|
* | 匹配前面的子表达式零次或多次。 |
+ | 匹配前面的子表达式一次或多次。 |
? | 匹配前面的子表达式零次或一次。 |
?= | 匹配后面的子表达式一次。 |
?! | 匹配后面的子表达式零次。 |
{n} | 匹配前面的子表达式恰好n次。 |
{n,} | 匹配前面的子表达式至少n次。 |
{n,m} | 匹配前面的子表达式至少n次,但不超过m次。 |
断言
| 断言 | 描述 |
|---|---|
^ | 匹配输入字符串的开始位置。 |
$ | 匹配输入字符串的结束位置。 |
\b | 匹配一个单词边界。 |
\B | 匹配一个非单词边界。 |
字符类
| 字符类 | 描述 |
|---|---|
[abc] | 匹配a、b或c。 |
[^abc] | 匹配除a、b和c以外的任意字符。 |
[a-z] | 匹配任何小写字母。 |
[A-Z] | 匹配任何大写字母。 |
[0-9] | 匹配任何数字。 |
[a-zA-Z0-9] | 匹配任何字母或数字。 |
预定义字符类
| 预定义字符类 | 描述 |
|---|---|
\d | 匹配任何数字,相当于[0-9]。 |
\w | 匹配任何字母、数字或下划线,相当于[a-zA-Z0-9_]。 |
\s | 匹配任何空白字符,包括空格、制表符、换页符等。 |
\D | 匹配任何非数字字符。 |
\W | 匹配任何非字母、数字或下划线字符。 |
\S | 匹配任何非空白字符。 |
标识符(修饰符)
| 标识符 | 描述 |
|---|---|
| i | 执行对大小写不敏感的匹配。 |
| g | 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止) |
正则表达式
/元字符/标识符
/^\d{3}$/g
正则匹配方法
- reg.test('str') 匹配字符串中指定的值。
- reg.exec('str') 捕获字符串中指定的值。
- str.search(reg) 搜索字符串内满足条件的字符串
- str.replace(reg) 替换字符串内满足条件的字符串
- str.match(reg) 捕获字符串内满足条件的字符串
1. reg.test('str')
test() 方法用于检测一个字符串是否匹配某个模式,如果字符串中含有匹配的文本,则返回 true,否则返回 false。
const reg = /^\d{3}$/ // 三个数字
const res = reg.test('113') // 匹配三个数字
console.log(res) // true
const res1 = reg.test('11311')
console.log(res1) // false
const res2 = reg.test('abc')
console.log(res2) // false
2. reg.exec('str')
reg.exec 捕获字符串中满足正则的第一个子字符串 exec() 检索字符串中指定的值。返回找到的值,并确定其位置。该函数返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null。
// g全局匹配------返回第一个匹配到的值
const reg111=/[a-z]{3}/g
const res4=reg111.exec('1234abc123')
console.log(res4)//[ 'abc', index: 4, input: '1234abc123', groups: undefined ]
const reg=/\d{3}/g
const res3=reg.exec('aaa456')
console.log(res3)// [ '456', index: 9, input: 'aaabbbbbb456', groups: undefined ]
const res=reg.exec('aaa123bbb')
console.log(res) // null
const res2=reg.exec('12345aaa123bbb456ccc')
console.log(res2) // [ '123', index: 0, input: '12345aaa123bbb456ccc', groups: undefined ]
const res1=reg.exec('123456aaa')
console.log(res1) // [ '456', index: 3, input: '123456aaa', groups: undefined ]
reg.exec()使用/\d{3}/g全局检索,会出现以下问题
// 如果使用reg.exec检索字符串一次,不会出现任何问题
// 如果使用reg.exec()一个模式多次检索字符串,后面的检索依赖前面检索的结果
// reg.exec()第一次检索字符串,如果检索成功,第二次将会从上一次检索成功的字符串索引开始,向后继续检索,如果后面没有检索到匹配结果返回null,如果检索成功返回匹配结果
// reg.exec()第一次检索字符串,如果检索失败,第二次检索相当于第一次检索
// 非全局匹配------返回第一个匹配到的值
const reg=/\d{3}/
const res=reg.exec('aaa123bbb456')
console.log(res) // [ '123', index: 3, input: 'aaa123', groups: undefined ]
const res2=reg.exec('144aaa123bbb456ccc')
console.log(res2) // [ '144', index: 0, input: '144aaa', groups: undefined ]
3. str.search(reg)
检索字符串内满足条件字符串。检索成功,返回满足条件的第一个字符串的索引。检索失败返回 -1
const reg = /\d{3}/g
const res = 'aa12abbb456cccbbb'.search(reg)
console.log(res) //8
const res1 = 'aaa123aaabb456bbbb'.search(reg)
console.log(res1) //3
const res2 = 'aaaaaabbbbbb'.search(reg)
console.log(res2) //-1
4. str.replace(reg)
替换字符串内满足条件的字符串,返回替换后的字符串
// g全局匹配------替换所有满足条件的字符串
const reg = /\d{3}/g
const res = 'aa12abbb456cccbbb'.replace(reg, '***')
console.log(res) //aa12abbb***cccbbb
const res1 = 'aaa123aaabb456bbbb'.replace(reg, '***')
console.log(res1) //aaa***aaabb***bbbb
const res2 = 'aaaaaabbbbbb'.replace(reg, '***')
console.log(res2) //aaaaaabbbbbb
// 非全局匹配------替换第一个满足条件的字符串
const reg = /\d{3}/
const res = 'aa12abbb456cccbbb'.replace(reg, '***')
console.log(res) //aa12abbb***cccbbb
const res1 = 'aaa123aaabb456bbbb'.replace(reg, '***')
console.log(res1) //aaa***aaabb456bbbb
const res2 = 'aaaaaabbbbbb'.replace(reg, '***')
console.log(res2) //aaaaaabbbbbb
5. str.match(reg)
捕获字符串内满足条件的字符串。捕获成功,返回一个数组,其中存放匹配成功的结果。捕获失败返回 null
// g全局匹配------返回所有满足条件的字符串
const reg = /\d{3}/g
const res = 'aa12abbb456cccbbb'.match(reg)
console.log(res) //[ '456' ]
const res1 = 'aaa123aaabb456bbbb'.match(reg)
console.log(res1) //[ '123', '456' ]
const res2 = 'aaaaaabbbbbb'.match(reg)
console.log(res2) //null
// 非全局匹配------返回第一个满足条件的字符串
const reg = /\d{3}/
const res = 'aa12abbb456cccbbb'.match(reg)
console.log(res) //[ '456', index: 8, input: 'aa12abbb456cccbbb', groups: undefined ]
const res1 = 'aaa123aaabb456bbbb'.match(reg)
console.log(res1) //[ '123', index: 3, input: 'aaa123aaabb456bbbb', groups: undefined ]
const res2 = 'aaaaaabbbbbb'.match(reg)
console.log(res2) //null
常用正则表达式
1. Email 地址:/^\w+([-+.]\w+)_@\w+([-.]\w+)_\.\w+([-.]\w+)\*\$/
2. 域名:/[a-zA-Z0-9][-a-za-z0-9]{0,62}(/.[a-zA-Z0-9][-a-za-z0-9]{0,62})+/.?/
3. InternetURL:/[a-zA-z]+://[^\s]_ 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]_)?\$/
4. 手机号码:/^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}\$/
5. 电话号码("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX"):/^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}\$/
6. 国内电话号码(0511-4405222、021-87888822):/\d{3}-\d{8}|\d{4}-\d{7}/
7. 身份证号(15 位、18 位数字):/^\d{15}|\d{18}\$/
8. 短身份证号码(数字、字母 x 结尾):/^([0-9]){7,18}(x|X)?$/ 或 /^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$/
9. 帐号是否合法(字母开头,允许 5-16 字节,允许字母数字下划线):/^[a-zA-Z][a-za-z0-9_]{4,15}\$/
10. 密码(以字母开头,长度在 6~18 之间,只能包含字母、数字和下划线):/^[a-zA-Z]\w{5,17}\$/
11. 强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在 8-10 之间):/^(?=._\d)(?=._[a-z])(?=.\*[A-Z]).{8,10}\$/
12. 日期格式:/^\d{4}-\d{1,2}-\d{1,2}/
13. 一年的 12 个月(01 ~ 09 和 1 ~ 12):/^(0?[1-9]|1[0-2])\$/
14. 一个月的 31 天(01 ~ 09 和 1 ~ 31):/^((0?[1-9])|((1|2)[0-9])|30|31)\$/
15. 中文字符的正则表达式:/[\u4e00-\u9fa5]/
16. 双字节字符:/[^\x00-\xff]/(<包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)>)
17. 腾讯 QQ 号:/[1-9][0-9]{4,}/ (腾讯 QQ 号从 10000 开始)
18. 中国邮政编码:/[1-9]\d{5}(?!\d)/ (中国邮政编码为 6 位数字)
19. IP 地址:/\d+\.\d+\.\d+\.\d+/ (提取 IP 地址时有用)
20. IP 地址:/((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))/