正则表达式
正则校验
正则表达式
/元字符/标识符
;/^\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
常用元字符
- /^xxx/ 表示以 xxx 开始
- /xxx$/ 表示以 xxx 结束
- . 查找单个字符,除了换行和行结束符
- \w 查找数字、字母及下划线
- \W 查找非单词字符
- \d 查找数字
- \D 查找非数字字符
- \s 查找空白字符
- \S 查找非空白字符
/^xxx/ 表示以 xxx 开始
// /^xxx/ 表示以 xxx 开始---字符串以xxx开头返回true,否则返回false
const reg = /^\d/ //匹配数字开头的字符串
const res = reg.test('aaa')
console.log(res) //false
const res1 = reg.test('111')
console.log(res1) //true
/xxx$/ 表示以 xxx 结束
// /xxx$/ 表示以 xxx 结束---字符串以xxx结束返回true,否则返回false
const reg = /\d$/ //匹配数字结尾的字符串
const res = reg.test('aaa')
console.log(res) //false
const res1 = reg.test('111')
console.log(res1) //true
. 查找单个字符,除了换行和行结束符。
// . 查找任意字符,除了换行和行结束符。---字符串包含除了换行和行结束符以外的任意字符返回true,否则返回false
const reg = /./ //匹配任意字符字符
const res = reg.test('a')
console.log(res) //true
const res1 = reg.test('1')
console.log(res1) //true
const res2 = reg.test('111')
console.log(res2) //true
const res2 = reg.test(' ')
console.log(res2) //true
\w 查找数字、字母及下划线。
// \w 查找数字、字母及下划线。---字符串包含数字、字母、下划线字符返回true,否则返回false
const reg = /\w/ //匹配任意字符字符
const res = reg.test('aaa')
console.log(res) //true
const res1 = reg.test('111')
console.log(res1) //true
const res2 = reg.test('___')
console.log(res2) //true
const res3 = reg.test('***')
console.log(res3) //false
\W 查找非单词字符。
// \W 查找非单词(数字、字母及下划线)字符。---字符串包含非数字、字母、下划线字符返回true,否则返回false
const reg = /\W/ //匹配任意字符字符
const res = reg.test('aaa')
console.log(res) //false
const res1 = reg.test('111')
console.log(res1) //false
const res2 = reg.test('___')
console.log(res2) //false
const res3 = reg.test('***')
console.log(res3) //true
\d 查找数字。
// \d 查找数字。---字符串中包含数字字符返回true,不包含数字返回false
const reg = /\d/ //匹配字符
const res = reg.test('a')
console.log(res) //false
const res1 = reg.test('aaa111bbb')
console.log(res1) //true
const res2 = reg.test('111')
console.log(res2) //true
\D 查找非数字字符。
// \D 查找非数字字符。---字符串中包含非数字字符返回true,不包含数字返回false
const reg = /\D/ //匹配字符
const res = reg.test('a')
console.log(res) //true
const res1 = reg.test('aaa111bbb')
console.log(res1) //true
const res2 = reg.test('111')
console.log(res2) //false
\s 查找空白字符。
// \s 查找空白字符。---字符串中包含空白字符返回true,不包含数字返回false
const reg = /\s/ //匹配字符
const res = reg.test('a')
console.log(res) //false
const res1 = reg.test('aaa111bbb ')
console.log(res1) //true
const res2 = reg.test('111')
console.log(res2) //false
\S 查找非空白字符。
// \S 查找非空白字符。---字符串中包含非空白字符返回true,不包含数字返回false
const reg = /\s/ //匹配字符
const res = reg.test('a')
console.log(res) //false
const res1 = reg.test('aaa111bbb ')
console.log(res1) //true
const res2 = reg.test(' ')
console.log(res2) //true
[] 指定查找范围
[abc] 查找方括号之间的任何字符
[^abc] 查找任何不在方括号之间的字符。
[0-9] 查找 0-9 的任意数字字符
[^0-9] 查找 0-9 意外的任意字符
[a-z] 查找 a-z 的任意字符
[^a-z] 查找 a-z 意外的任意字符
[A-Z] 查找 A-Z 的任意字符
[^a-z] 查找 A-Z 意外的任意字符
// [abc] 查找方括号之间的任何字符---字符串中包含[]内的字符返回true,不包含数字返回false
const reg = /[abc]/ //匹配字符
const res = reg.test('a')
console.log(res) //true
const res1 = reg.test('aaa111bbb')
console.log(res1) //true
const res2 = reg.test('111')
console.log(res2) //false
// [^abc] 查找任何不在方括号之间的字符。---字符串中包含非[]内字符返回true,不包含数字返回false
const reg = /[^abc]/ //匹配字符
const res = reg.test('a')
console.log(res) //false
const res1 = reg.test('aaa111bbb')
console.log(res1) //true
const res2 = reg.test('111')
console.log(res2) //true
// [0-9] 查找 0-9 的任意数字字符
const reg = /[0-9]/ //匹配字符
const res = reg.test('a')
console.log(res) //false
const res1 = reg.test('aaa111bbb')
console.log(res1) //true
const res2 = reg.test('111')
console.log(res2) //true
// [^0-9] 查找 0-9 意外的任意字符
const reg = /[^0-9]/ //匹配字符
const res = reg.test('a')
console.log(res) //true
const res1 = reg.test('aaa111bbb')
console.log(res1) //true
const res2 = reg.test('111')
console.log(res2) //false
量词 指定匹配字符数量
n+
匹配任何包含至少一个 n的字符串。
例如,/a+/ 匹配 "candy" 中的 "a","caaaaaaandy" 中所有的 "a"。
n*
匹配任何包含零个或多个 n的字符串。
例如,/bo*/ 匹配 "A ghost booooed" 中的 "boooo","A bird warbled" 中的 "b",但是不匹配 "A goat grunted"。
n?
匹配任何包含零个或一个 n 的字符串。
例如,/e?le?/ 匹配 "angel" 中的 "el","angle" 中的 "le"。
n{X}
匹配包含 X 个 n 的序列的字符串。
例如,/a{2}/ 不匹配 "candy," 中的 "a",但是匹配 "caandy," 中的两个 "a",且匹配 "caaandy." 中的前两个 "a"。
n{X,}
X 是一个正整数。前面的模式 n 连续出现至少 X 次时匹配。
例如,/a{2,}/ 不匹配 "candy" 中的 "a",但是匹配 "caandy" 和 "caaaaaaandy." 中所有的 "a"。
n{X,Y}
X 和 Y 为正整数。前面的模式 n 连续出现至少 X 次,至多 Y 次时匹配。
例如,/a{1,3}/ 不匹配 "cndy",匹配 "candy," 中的 "a","caandy," 中的两个 "a",匹配 "caaaaaaandy" 中的前面三个 "a"。注意,当匹配 "caaaaaaandy" 时,即使原始字符串拥有更多的 "a",匹配项也是 "aaa"。
?=no
/abc(?=no)/匹配 abc 其后紧接指定字符串 no的字符串。
?!no
/abc(?!no)/匹配 abc其后没有紧接指定字符串 no 的字符串。
标识符(修饰符)
i 执行对大小写不敏感的匹配。
g 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)
常用正则表达式
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))/