Javascript高级:正则表达式基础与应用
少去去游荡,中年想掘藏,老年做和尚
文章目录
- 前言
- 正则的符号
- 参数
- 正则表达式创建对象方式
- 字符串方法
- 验证汉字
- 总结
前言
正则表达式(Regular Expression,通常缩写为regex或regexp)是一种强大的文本处理工具,用于匹配、查找、替换符合一定模式的字符串。它在编程语言中广泛使用,特别是在文本处理任务中,如数据验证、搜索替换等。
正则的符号
- 预定义类 (元字符)
- [^\n\r] :除了换行和回车之外的任意字符
// 如果检测的字符串里面包含 除了换行和回车之外的任意字符 那就返回true,否则返false console.log(/./.test('\r')) // false console.log(/./.test('\r\n')) // false console.log(/./.test('' + '')) // false console.log(/./.test('\r1')) // true console.log(/./.test('32435dh1')) // true console.log(/./.test('d')) // true
- \d [0-9]:数字字符 [0123456789]
// 检测的字符串里面如果有数字,就是true, 如果没有数字,就是false console.log(/\d/.test('abc')) // flase console.log(/\d/.test('!@#$')) // false console.log(/\d/.test('!@#$adfgethfe')) // false console.log(/\d/.test('!@#$adfgethfe1')) // true console.log(/\d/.test('123456')) // true
- \D [^0-9]:非数字字符
// test检测:只要被检测的字符串中包含了非数字字符,那么结果就是true console.log(/\D/.test('abc')) // true console.log(/\D/.test('!@#$')) // true console.log(/\D/.test('!@#$adfgethfe')) // true console.log(/\D/.test('!@#$adfgethfe1')) // true console.log(/\D/.test('13243546b576871')) // true console.log(/\D/.test('123456')) // false
- \s [\f\r\n\t\v]:不可见字符
console.log(/\s/.test('abc\r')) // true console.log(/\s/.test('abc\n')) // true console.log(/\s/.test('abc\r\n')) // true console.log(/\s/.test(' ')) // true console.log(/\s/.test('' + '')) // false 他是一个空字符串,没有不可见字符
- \S [^\f\r\n\t\v]:可见字符
console.log(/\S/.test('abc\r')) // true console.log(/\S/.test('abc\n')) // true console.log(/\S/.test('abc\r\n')) // true console.log(/\S/.test(' ')) // false console.log(/\S/.test('\r\n\t\r')) // false console.log(/\S/.test('abcdeg')) // true
- \w [a-zA-Z0-9]:单词字符
console.log(/\w/.test('!@#$%#@#$%$#@')) // false console.log(/\w/.test('!@#$%#@#$%$#@a')) // true console.log(/\w/.test('!@#$%#@0#$%$#@')) // true console.log(/\w/.test('!@#$%#@_#$%$#@')) // true console.log(/\w/.test('!!!!!1234567')) // true console.log(/\w/.test('!!!!!')) // false
- \W [^a-aA-Z0-9]:非单词字符
// 检测的字符串里面如果有非单词字符,就返回true console.log(/\W/.test('abcserge3')) // false console.log(/\W/.test('fsdgetherg!')) // true console.log(/\W/.test('!123456@')) // true console.log(/\W/.test('!!!!!1234567')) // true console.log(/\W/.test('!!!!!')) // true
- [^\n\r] :除了换行和回车之外的任意字符
- 自定义类
// 用test检测的字符串里面,有没有包含d这个字母。如果有就是true console.log(/d/.test('123')) // false console.log(/d/.test('123d')) // true // 用test检测的字符串里面,有没有包含heiya,如果有就是true // 一定是连续的完整的至少出现一次,结果才是true console.log(/heiya/.test('hei')) // false console.log(/heiya/.test('林黑群真hei')) // false console.log(/heiya/.test('he1iy2a')) // false // 用test检测的字符串里面,如果有heia,或者heya,那么就是true console.log(/he(i|y)a/.test('hei')) // false console.log(/he(i|y)a/.test('heiya')) // false console.log(/he(i|y)a/.test('heia')) // true console.log(/he(i|y)a/.test('heya')) // true
- 或(|)和优先级()
// 用test检测的字符串里面,如果有hei或者有ma都是true console.log(/hei|ya/.test('hei')) // true console.log(/hei|ya/.test('ya')) // true console.log(/hei|ya/.test('heiya')) // true console.log(/hei|ya/.test('heiheiyaya')) // true console.log(/hei|ya/.test('heiyaheiya')) // true console.log(/hei|ya/.test('林黑群真yhei')) // true console.log(/hei|ya/.test('he1iy2a')) // false
- 简单类 []:只代表一个字符
console.log(/[abc]/.test('a')) // true console.log(/[abc]/.test('d')) // false console.log(/[abc]/.test('dddddbdddd!!!!!!')) //t rue console.log(/[abc]/i.test('dddddBdddd!!!!!!')) // true // 因为这里是一个自定义类,所以要出现至少是y中间是a或者b或者cz连起来的三个字符 // 检测的字符串中有:yaz ybz ycz,就是为true console.log(/y[abc]z/.test('yaz')) // true console.log(/y[abc]z/.test('yz')) // false // 或可以这样写 console.log(/y(aa|bb|cc)z/.test('yaaz')) // true console.log(/y(aa|bb|cc)z/.test('ybbz')) // true console.log(/y(aa|bb|cc)z/.test('yccz')) // true console.log(/y(aa|bb|cc)z/.test('ybaz')) // false
- 负向类 [^]
// 如果用test检测的字符串中,有除了中括号中的内容之外的任意一个,出现一次或者一次以上,就是true console.log(/[^abc]/.test('a')) // false console.log(/[^abc]/.test('abcaaabbbcccaaabc')) // false console.log(/[^abc]/.test('abcaaabbbcccaaabc!')) // true console.log(/[^abc]/.test('ad')) // true console.log(/[^abc]/.test('a1')) // true
- 范围类:表示一个范围
console.log(/[a-z]/.test('1111')) // false console.log(/[a-z]/.test('1111h')) // true
- 组合类
console.log(/[a-m1-5]/.test('b')) // true console.log(/[a-m1-5]/.test('6666')) // false console.log(/[^0-5][^a-g]/.test('6')) // false console.log(/[^0-5][^a-g]/.test('6z')) // true console.log(/[^0-5][^a-g]/.test('4yaaabbbc7cc')) // true c是0-5之外的,7是a-g之外的,所以c7是满足的
- 边界:/^/ 以什么开头;/$/ 以什么结束
// ^ 会匹配行或者字符串的起始位置 console.log(/\d/.test('aaabb123ccc')) // true 预定义类,只要检测的字符串中出现了数字就是true. console.log(/^\d/.test('aaabb123ccc')) // false 如果检测的字符串的起始位置是数字就是true. console.log(/^\d/.test('1aaabb123ccc')) // true console.log(/^6/.test('6')) // true console.log(/^6/.test('76')) // false console.log(/^6.a/.test('666abat ')) // false // $ 会匹配行或字符串的结尾位置 console.log(/ac/.test('ac777')) // true console.log(/ac$/.test('ac777')) // false
- 严格匹配:/^ $/组合在一起,就表示严格匹配 只能是他不能有别的东西,并且他只能出现一次,有且只有一次
console.log(/^男$/.test('大锐是男的')) //f alse console.log(/^男$/.test('男')) //t rue console.log(/^男$/.test('鹏鹏是男男男男的')) //f alse console.log(/^男$/.test('男女')) //f alse console.log(/^男$/.test('男男')) //f alse console.log(/^男$/.test('男')) //t rue console.log(/^abc$/.test('abc1')) //f alse console.log(/^abc$/.test('abcabc')) //f alse console.log(/^bc$/.test("bcbcbc")) // 严格匹配 false console.log(/^\d{2}$/.test('22')) // true console.log(/^\d{2}$/.test('223')) // false console.log(/^\d{2}$/.test('22b')) // false console.log(/^\d$/.test('9')) // true console.log(/^abc\d$/.test('abc7')) // true console.log(/^abc\d$/.test('abc7abc9')) // false console.log(/abc\d/.test('abc7abc9')) // true
- 量词
- *:重复零次或更多
console.log(/color/.test('color')) // true console.log(/^colo*r$/.test('colooorcolooor')) // false 不符合严格匹配 console.log(/^colo*r$/.test('olooor')) // false 不符合严格匹配
- +:重复一次或更多次
console.log(/^colo+r$/.test('colr')) // false console.log(/^colo+r$/.test('color')) // true console.log(/^colo+r$/.test('colooorcolooor')) // false 不符合严格匹配
- ?:重复零次或更多次
console.log(/^colo?r$/.test('colooorcolooor')) // false 不符合严格匹配 console.log(/^colo?r$/.test('colorcolor')) // false 不符合严格匹配
- {n}:n次
console.log(/^colo{2}r$/.test('color')) // false console.log(/^colo{2}r$/.test('coloor')) // true console.log(/^colo{2}r$/.test('coloorcoloor')) // false 不符合严格匹配 console.log(/^colo{2}r$/.test('coloorc')) // false 不符合严格匹配
- {n,}:重复n次或更多
console.log(/^colo{2,}r$/.test('color')) // false console.log(/^colo{2,}r$/.test('coloor')) // true console.log(/^colo{2,}r$/.test('coloorcoloor')) // false 不符合严格匹配
- {n,m}:重复出现的次数比n多但比m少
console.log(/^colo{2,3}r$/.test('colooor')) // true console.log(/^colo{2,3}r$/.test('coloooor')) // false console.log(/^colo{2,3}r$/.test('coloorcoloor')) // false 不符合严格匹配
- *:重复零次或更多
参数
- i:忽略大小写
- g:全局匹配
global
- gi:全局匹配 + 忽略大小写
正则表达式创建对象方式
- 使用构造函数创建
var 变量名 = new RegExp(/表达式/)
var reg1 = new RegExp('男|女') var res = reg1.test('森哥是nan的吗?') console.log(res)
- 使用字面量方式创建
var 变量名 = /表达式/
注意: // 是注释 里面放东西就是正则var reg2 = /<.{4}>/ var res = reg2.test('哈哈哈嘿嘿嘿嘻嘻嘻') console.log(res)
字符串方法
- replace (替换)
// 要求:把下面字符串中的b都换成B var str = 'abfdshbafhb' var newSrt = str.replace(/b/g, 'B') // 全局匹配 global 缩写g console.log(newSrt) // 要求:那下面字符串中的数字都改成1000 var str1 = '小甜甜100 爱丽丝100 冰雪公主100' var newStr1 = str1.replace(/\d+/g, '1000') console.log(newStr1)
- match (提取)
// 有返回值,返回值是一个数组,提取出符合正则要求的数据组成的数组;如果字符串没有符合这个正则规则的数据,那就返回一个null// 提取工资 var str = '小甜甜100 爱丽丝200 冰雪公主300' var arr = str.match(/\d+/g) console.log(arr) // 提取email地址 var str1 = "123123@xx.com,fangfang@valuedopinions.cn 楼主好人一生平安286669312@qq.com 楼主求个种子2、emailenglish@emailenglish.englishtown.com 286669312@qq.com..." var arr1 = str1.match(/^\w+(\.\w+)+$/g) console.log(arr1)
- search (检索)
// 需求:获取下面这个字符串第一次出现数字的位置 var str = '龙翔100俊杰200冰川300豆蔻400' var res = str.search(/\d+/) console.log(res)
- split (分割)
var str = '龙翔100俊杰200豆蔻300冰川' var arr = str.split(/\d+/) console.log(arr)
验证汉字
- 不管是哪一个汉字,在js中都有一个唯一的Unicode编码
- 通过
escape('汉字')
查看一个汉字的Unicode编码 - 通过
UNicode('编码')
转回汉字 - 所有的汉字都在
[\u4e00-\u9fa5]
这个范围中
console.log(/[\u4e00-\u9fa5]/.test('ewrfewrferewrewr')) // false
console.log(/[\u4e00-\u9fa5]/.test('ewrfewrferew国rewr')) // true
console.log(/^[\u4e00-\u9fa5]{2,4}$/.test('东方不败')) // true
console.log(/^[\u4e00-\u9fa5]{2,4}$/.test('sb东方不败lh')) // false
总结
本文档不仅涵盖了正则表达式的基本理论知识,而且还提供了大量实用的操作指导,旨在帮助读者全面提升正则表达式技能,正则表达式虽然强大,但其语法可能会比较复杂,需要时间和实践来掌握。不同的编程环境对正则表达式的支持也有所不同,因此在使用时需要注意查阅相关文档。