正则表达式
一、什么是正则表达式
1. 什么是正则表达式
正则表达式( regular expression )描述了 ,经常被用于检查字符串是否符合预定的格式要求
例子:
js// 检查某个字符串是否为 6 位数字 // 待检查的字符串 const str = '123456' // 描述了字符串必须是 “6 位数字” 构成的规则 // 正则表达式的规则 const reg = /^\d{6}$/ // 正则检查 if (reg.test(str)) { // test() 检查某个字符串是否符合正则要求 console.log('符合要求') } else { console.log('不符合要求') }
2. 正则表达式 “按位” 描述规则
- 正则表达式 “按位” 描述规则,是指它是一位一位的描述字符串的构成形式
- 比如检查字符串是否符合:以字母 m 开头,然后是 3 位数字,最后以字母 n 结尾(
/^m\d\d\dn$/或/^m\d{3}n$/)
二、正则表达式的基本使用
1. 正则表达式的创建
使用
/内容/的语法形式,可以快速创建正则表达式(推荐)jsconst reg = /^\d{6}$/也可以使用
new RegExp('内容')的形式,创建正则表达式(不推荐,容易有歧义)js// 在字符串中 \ 已经表示转义,所以要使用 \\ ,且两侧不用添加 / const reg = new RegExp('^\\d{6}$')使用
typeof运算符检查正则表达式的类型为objectjsconsole.log(typeof reg) // object
2. 元字符
- “元字符” 是指 的字符
| 元字符 | 功能 |
|---|---|
| \d | 匹配一个数字 |
| \D | 匹配一个非数字字符 |
| \w | 匹配一个单字字符(字母、数字或者下划线) |
| \W | 匹配一个非单字字符 |
| \s | 匹配一个空白字符,包括空格、制表符和换行符 |
| . | 任意字符 |
| ^ | 匹配开头 |
| $ | 匹配结尾 |
| \ | 只匹配几项中的一项 |
元字符注意事项
- 如果使用
new RegExp()写法时,反斜杠需要多写一个 - 比如
/^\d{3}$/和new RegExp('^\\d{3}$')是等同意义
- 如果使用
元字符使用举例
某快递公司运单号形式是这样的:123-4567-890,请使用 正则表达式 检查某字符串是否符合此格式
jsconst str = '123-4267-890' const reg = /^\d{3}-\d{4}-\d{3}$/ console.log(reg.test(str)) // true
字符的转义
在特殊字符之前的反斜杠 \ 表示下个字符不是特殊字符,应该按照字面理解
jsconst reg = /^.$/ // 检查字符串是不是任意字符 const reg = /^\.$/ // 检查字符串是不是一个. const reg = /^\\$/ // 检查字符串是不是一个反斜杠不管一个符号有没有特殊意义,都可以在其之前添加一个 \ 以确保它表达的是这个符号的本身
js// 匹配 123.45^67#89 const str = '123.45^67#89' const reg = /^\d{3}\.\d{2}\^\d{2}\#\d{2}$/ // # 号前的反斜杠可有可无,加上确保安全 console.log(reg.test(str)) // true
3. 方括号表示法
使用方括号,比如 [xyz] ,可以 ,表示匹配方括号中任意字符
某学校的学号规定:第 1 位是个字母,b 表示本科生, y 表示研究生,后面是 7 位数字,用正则表示为:
/^[by]\d{7}$/可以使用
| 元字符 | 等价的方括号表示法 |
|---|---|
| \d | [0-9] |
| \D | [^0-9] |
| \w | [A-Za-z0-9_] |
| \W | [^A-Za-z0-9_] |
方括号表示法练习
- 请验证某字符串是否是5位字母,大小写均可 ->
/^[a-zA-Z]{5}$/ - 请验证某字符串是否是5位,且仅有小写字母、点构成 ->
/^[a-z.]{5}$/ - 请验证某字符串是否是4位小写字母,且最后一位不能是 m 字母 ->
/^[a-z]{3}[a-ln-z]$/
- 请验证某字符串是否是5位字母,大小写均可 ->
- 方括号中除了反斜杠 \ 需要转义外,其他元字符不需要转义
4. 量词
| 量词 | 意义 |
|---|---|
| * | 匹配前一个表达式 0 次或者多次,等价于 |
| + | 匹配前面一个表达式 1 次或者多次,等价于 |
| ? | 匹配前面一个表达式 0 次或者 1 次,等价于 |
| n 是一个正整数,匹配前面一个字符刚好出现了 n 次 | |
| n 是一个正整数,匹配前一个字符至少出现了 n 次 | |
| n 和 m 都是正整数,匹配前面的字符至少 n 次,最多 m 次 |
- 量词例子:
- 请验证字符串是否符合手机号码的规则:11 位数字,并且肯定以 1 开头 ->
/^1\d{10}$/ - 请验证某字符串是否是这样:以字母开头,中间是任意位数字(最少 1 位)构成,并以字母结尾 ->
/^[a-zA-Z]\d+[a-zA-Z]$/ - 请验证某字符串是否符合网址规侧:以
www.开头,中间是任意(最少 1 位)的字符(字母数字下划线),最后以.com结尾或以.com.cn结尾 ->/^www\.\w+\.com(\.cn)?$/
- 请验证字符串是否符合手机号码的规则:11 位数字,并且肯定以 1 开头 ->
5. 修饰符
- 修饰符也叫作标志( flags )用于使用正则表达式,实现高级搜索
| 修饰符 | 意义 |
|---|---|
| i | 不区分大小写搜索 |
| g | 全局搜索 |
修饰符的使用
const reg = /m/giconst reg = new RegExp('m', 'gi')
三、正则表达式和字符串
1. 正则表达式的相关方法
- 正则表达式可以 “打点” 调用哪些方法?
| 方法 | 简介 |
|---|---|
| test() | 测试某字符串是否匹配正则表达式,返回布尔值 |
| exec() | 根据正则表达式,在字符串中进行查找,返回结果数组或者 null |
test() 方法
- 正则表达式的 test() 方法,用来,它返回
true或false /^[a-z]\d{3}[a-z]$/.test('a123z') === true
- 正则表达式的 test() 方法,用来,它返回
exec() 方法
exec() 方法功能是:在一个指定字符串中执行一个 ,返回一个结果数组或
nulljsconst str = 'abc123def456ghi789' const reg = /\d+/ const res = reg.exec(str) // ['123', index: 3, input: 'abc123def456ghi789', groups: undefined]exec() 方法的逐条遍历
exec() 方法最有趣的是, ,这意味着可以对单个字符串中的多次匹配结果进行
jsconst str = 'abc123def456ghi789' const reg = /\d+/g // + 表示贪婪,尽可能多的匹配 const res1 = reg.exec(str) // ['123'] const res2 = reg.exec(str) // ['456'] const res3 = reg.exec(str) // ['789'] const res4 = reg.exec(str) // null // 实际工作中可使用 while let res while (res = reg.exec(str)) { console.log(res) }
2. 字符串的相关方法
- 字符串使用正则表达式的方法
| 方法 | 简介 |
|---|---|
| search() | 在字符串中根据正则表达式进行查找匹配,返回首次匹配到的位置索引,匹配不到则返回 -1 |
| match() | 在字符串中根据正则表达式进行查找匹配,返回一个数组,匹配不到则返回 null |
| replace() | 使用字符串替换方法,可以使用正则表达式 |
| split() | 分割字符串为数组,可以使用正则表达式 |