正则表达式

123 阅读6分钟

正则校验

正则表达式基本组成部分

元字符

元字符描述
.匹配除换行符以外的任何单个字符。
*匹配前面的子表达式零次或多次。
+匹配前面的子表达式一次或多次。
?匹配前面的子表达式零次或一次。
^匹配输入字符串的开始位置。
$匹配输入字符串的结束位置。
|表示“或”操作。
[]定义字符集。
()定义一个子表达式。

量词

量词描述
*匹配前面的子表达式零次或多次。
+匹配前面的子表达式一次或多次。
?匹配前面的子表达式零次或一次。
?=匹配后面的子表达式一次。
?!匹配后面的子表达式零次。
{n}匹配前面的子表达式恰好n次。
{n,}匹配前面的子表达式至少n次。
{n,m}匹配前面的子表达式至少n次,但不超过m次。

断言

断言描述
^匹配输入字符串的开始位置。
$匹配输入字符串的结束位置。
\b匹配一个单词边界。
\B匹配一个非单词边界。

字符类

字符类描述
[abc]匹配abc
[^abc]匹配除abc以外的任意字符。
[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

正则匹配方法

  1. reg.test('str') 匹配字符串中指定的值。
  2. reg.exec('str') 捕获字符串中指定的值。
  3. str.search(reg) 搜索字符串内满足条件的字符串
  4. str.replace(reg) 替换字符串内满足条件的字符串
  5. 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-4405222021-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 个月(0109112):/^(0?[1-9]|1[0-2])\$/
14. 一个月的 31 天(0109131):/^((0?[1-9])|((1|2)[0-9])|30|31)\$/
15. 中文字符的正则表达式:/[\u4e00-\u9fa5]/
16. 双字节字符:/[^\x00-\xff]/(<包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2ASCII字符计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))/