1.介绍
正则表达式是用于匹配字符串中字符组合的模式。在 JavaScript 中,正则表达式也是对象。这些模式被用于 RegExp 的 exec 和 test 方法,以及 String 的 match、matchAll、replace、search 和 split 方法。本章介绍 JavaScript 正则表达式
正则表达式(Regular Expression)描述了一种字符串匹配的模式
- 可以用来检查一个字符串中是否含有某种子串,比如
Hello World
中是否含有大写字母 - 将匹配的子串做替换,比如将
this is javascript
中每个单词首字母变为大写 - 验证字符串是否符合条件,比如 验证输入的用户名是否是由数字字母组合而成的
- .......
匹配就是在某个字符串中查找你想要查找的内容(由正则表达式决定),如果查找到了,就表示匹配。没有查找到就表示不匹配。
正则表达式本身是一门独立的技术,可以被大多数编程语言所使用,如Javascript、PHP、Java…
使用场景:
- 例如验证表单:手机号表单要求用户只能输入11位的数字 (匹配)
- 过滤掉页面内容中的一些敏感词(替换),或从字符串中获取我们想要的特定部分(提取)等
2.正则的基本使用
2.1 定义正则
const reg = /表达式/
- 正则表达式使用 斜线 作为起始和结尾标识符,两条斜线之间写正则表达式
- 正则表达式也是对象
2.2 正则方法
test() - 执行正则匹配。匹配返回true,不匹配返回false
exec() - 方法执行一个正则匹配,返回一个包含结果的数组或null。并将表示匹配的位置 置为下一个匹配的位置
match() - 执行正则匹配,返回匹配的结果或null
replace() - 使用正则表达式进行匹配,并将匹配的结果替换
split() - 使用正则表达式进行匹配,并使用匹配的结果分割字符串为数组
search() - 在字符串中搜索符合正则匹配的结果,返回匹配字符的位置或 -1
2.3 使用正则
- test()方法 用来查看正则表达式与指定的字符串是否匹配
- 如果正则表达式与指定的字符串匹配 ,返回true,否则false
-
// 1.先定义一个正则表达式 let reg = /前端/ // 2.调用 test() 方法进行测试【如果是字符串有连续的 前端 字样,结果就是true, 否则为false】 console.log(reg.test('前端学习')) // true console.log(reg.test('学前端要有兴趣')) // true console.log(reg.test('前后端我都要学')) // false
3.边界符
正则表达式中的边界符(位置符)用来提示字符所处的位置,可以判断字符串的开头是什么,结尾是什么,还能精确判断整个字符串是什么,主要有两个字符
边界符 | 说明 |
^ | 开头判断,表示匹配行首的文本(以谁开始) |
$ | 结尾判断,表示匹配行尾的文本(以谁结束) |
如果 ^ 和 $ 在一起,表示必须是精确匹配
// 1. 定义正则表达式
let reg = /^web/ // 开头必须是web
let reg2 = /web$/ // 结尾必须是web
// 2. 验证
console.log(reg.test('移动web')) // false
console.log(reg.test('webAPIs')) // true
console.log(reg2.test('移动web')) // true
console.log(reg2.test('webAPIs')) // false
// -----------3.精确匹配----------------
// 如果^ 和 $ 符号都用上,表示精确匹配
let reg3 = /^web$/ // 这种写法,只有 web 和他匹配
console.log(reg3.test('web')) // true
console.log(reg3.test('webweb')) // false
4.字符类
量词语法 | 描述 |
. | 匹配除换行符之外的任何单个字符 |
[abc] | 匹配 [] 中的任意字符(字符串中只要包含a或者b或者c,就算匹配,全都不包括则不匹配) |
[^abc] | 和 [abc] 相反;匹配除了abc以外的其他任意字符 |
[0-9] | 匹配0~9之间的任意一个数字。也可以写成 [5-8]这种,表示匹配 5~8 之间的任意一个数字 |
[a-z] | 匹配一个小写字母,也可以写成 [a-f] 这种,表示匹配 a~f 之间的任意一个字母 |
[A-Z] | 和 [a-z] 类似,只不过匹配大写字母 |
[A-z] | 匹配大写字母、小写字母、_ \ [ ] ` ^ 中的任意一个字符 |
[0-9a-zA-Z] | 匹配任意一个数字、字母 |
\d | 匹配任意一个数字,相当于 [0-9] |
\D | 匹配任意一个非数字 字符,相当于 [^0-9] |
\w | 匹配大写字母、小写字母、下划线 中的任意一个字符,相当于 [A-z] |
\W | 和 \w 相反,匹配除了大写字母、小写字母、下划线以外的任意一个字符 |
\s | 匹配一个空白字符,包括换行符、制表符、空格符等 |
\S | 匹配一个非空白字符,和 \s 相反 |
5. 元字符
- 一元运算符,参与运算的 表达式或变量 只有一个 比如:a++
- 二元运算符,参与运算的 表达式或变量 有两个 比如:a + b
- 三元运算符,参与运算的 表达式或变量 有三个 比如: a > b ? xxx : yyy
元字符的基本使用
// ---------正则表达式——元字符---------
// 正则中的元字符,首先表示字符,但是只表示一个字符
// \w 表示数字字母下划线 \d 表示数字 \s 表示空白
// \W 表示非数字字母下划线 \D 表示非数字 \S 表示非空白
let reg = /\w/ // 这不是精准匹配,所以下面的字符串只要出现了数字、字母、下划线就可以
console.log(reg.test('!@#$%^&*')) // false
console.log(reg.test('你好')) // false
console.log(reg.test('a你好')) // true
console.log(reg.test('A你好')) // true
console.log(reg.test('9你好')) // true
console.log(reg.test('_你好')) // true
let reg2 = /^\w$/ // 这是精准匹配,又因为 \w 表示一个字符,所以只匹配一个字符
console.log(reg2.test('ab')) // false 因为 \w 只能匹配一个字符
console.log(reg2.test('中')) // false
console.log(reg2.test('a')) // true
console.log(reg2.test('6')) // true
console.log(reg2.test('_')) // true
console.log(reg2.test('A')) // true
元字符之方括号
// [abc] [^abc] [389] [a-z] [A-Z] [0-9] [^a-z] [3-7] [a-z0-9] 表示一个范围内的字符
// 1.[abc] 匹配a、b、c、中的一个字符,如果字符串中有a或者b或者c,都匹配,当然,有ab更匹配
// 在精确匹配模式中,[abc]只能匹配匹配一个字符
let reg = /[abc]/
console.log(reg.test('def')) // false def中没有a,也没用b,也没有c
console.log(reg.test('daf')) // true daf中有 a
console.log(reg.test('abf')) // true abf中既有a,又有b
let reg = /^[abc]$/ // 只能匹配 a 或者 b 或者 c
console.log(reg.test('a')) // true
console.log(reg.test('b')) // true
console.log(reg.test('c')) // true
console.log(reg.test('d')) // false
console.log(reg.test('abc')) // false
// 2. [^xxx] 表示取反
let reg = /^[^abc]$/ // 匹配除了a、b、c以外的其他字符
console.log(reg.test('mn')) // false 不匹配,因为一个方括号只能匹配一个字符
console.log(reg.test('b')) // false
console.log(reg.test('m')) // true
console.log(reg.test('$')) // true
console.log(reg.test('中')) // true
// 3. [a-z] [b-f] [0-9] [A-Z] [3-7] 都表示一个范围
let reg = /^[a-z]$/
console.log(reg.test('b')) // true
console.log(reg.test('bc')) // false
console.log(reg.test('B')) // false
let reg2 = /^[3-7]$/ // 匹配3~7之间的一个数字,包括3和7
console.log(reg2.test(6)) // true
console.log(reg2.test(7)) // true
console.log(reg2.test(2)) // false
// 4.组合写法
let reg = /^[0-9_acf]$/ // 匹配数字、_、a、c、f
console.log(reg.test('8')) // true
console.log(reg.test('_')) // true
console.log(reg.test('c')) // true
console.log(reg.test('d')) // true
6.量词
- ? 表示前面的【一个】字符,可以有0个或1个,比如 /ab?c/ 表示b可以有0个或1个,ac、abc都和模式匹配
- + 表示1个或多个
- * 表示任意个(0个、1个、2个....n个)
- {n} 表示n个
- {n,} 表示至少n个
- {n,m} 表示 n <= 个数 <= m 【坑点:中间不要加空格,比如{n, m}就是错的】
- 注意: 逗号左右两侧千万不要出现空格
let reg = /^a?$/
console.log(reg.test('')) // true
console.log(reg.test('a')) // true
console.log(reg.test('aa')) // false
let reg1 = /^\w?$/ // 表示匹配0个或1个 数字字母下划线
let reg2 = /^[a-z0-9]?$/ // 表示匹配0个或1个 数字或小写字母
let reg3 = /^[a-z][0-9]?$/ // 匹配必须有一个小写字母,后面的数字可以有0个或1个
console.log(reg3.test('99')) // false
console.log(reg3.test('A9')) // false
console.log(reg3.test('a9')) // true
console.log(reg3.test('a')) // true
// 用户名要求必须是小写字母,长度只能是6~10位
let reg4 = /^[a-z]{6,10}$/
console.log(reg4.test('abcdefg')) // true
console.log(reg4.test('abc')) // false
console.log(reg4.test('abcdefgzxczxczcgsdgasgsf')) // false
7.分组与引用
// 分组,就是用小括号分组
// 13266668888
// 132****8888
// (\d\d\d) \d\d\d\d (\d\d\d\d)
// 要求匹配4个数字,要求前两位相同,后两位相同 比如,3388 4455
let reg1 = /^(\d)\1(\d)\2$/
// (\d) 匹配一个数字,加了小括号,表示捕获这个数字(知道这个数字是什么)
// \1 表示要和第1个小括号的内容一致
// \2 表示要和第2个小括号的内容一致
// \3 .........................
console.log(reg1.test('1234')) // false
console.log(reg1.test('5566')) // true
console.log(reg1.test('8888')) // true
// 要求匹配4个连续的数字,要求2、3位置的数字要一致;1/4位相同
let reg = /^(\d)(\d)\2\1$/
console.log(reg.test('1221')) // true
console.log(reg.test('1223')) // false
console.log(reg.test('2222')) // true
8.修饰符
修饰符要放到 /xxx/
之后,比如 g
就是一个修饰符。多个修饰符可以一起使用。
量词语法 | 描述 |
g | 是单词 global 的缩写,匹配所有满足正则表达式的结果 |
i | 是单词 ignore 的缩写,正则匹配时字母不区分大小写 |
let str = 'this is a Javascript'
// -------写到/xxx/后面的字符,叫做修饰符---------------
// g -- global 全局的,下面的例子,加入g表示全局替换
console.log(str.replace(/s/g, 'S'))
// ------ignore 忽略,加入这个修饰符,不区分大小写--
let str2 = 'This is a JS'
console.log(str2.replace(/s/gi, '默语'))
9.替换
replace 替换方法,可以完成字符的替换
// ------------字符串.replace() // 替换字符方法 -----
// 字符串.replace(/正则表达式/, '替换的文本')
let str = 'this is a Javascript'
console.log(str.replace('s', 'S')) // 默认只换找到的第1个字符
console.log(str.replace(/s/, 'S')) // 默认只换找到的第1个字符
10.匹配中文
// 为了表示世界上所有的字符,创造了 Unicode 编码
// 每一个Unicode编码对应一个字符
// 具体的Unicode编码表:http://www.tamasoft.co.jp/en/general-info/unicode.html
let reg = /^[\u4e00-\u9f5a]$/
console.log(reg.test('hello')) // false
console.log(reg.test('你好')) // false(中括号只能显示一个字符)
console.log(reg.test('你')) // true