规则表达式(正则表达式)
我们来书写一段规则, 用于匹配一段字符串是否符合规则
创建的时候 1. 字面量的形式 2. 内置构造函数
1. 字面量的形式
const reg = /abc/
2. 内置构造函数
const reg1 = new RegExp('abc')
正则的常用方法
-
- 匹配
-
test:
匹配字符串是否符合正则规则 符合 --- true 不符合 --- false 语法 正则.test(字符串)const reg = /abc/ // 要求字符串中 包含 abc console.log(reg.test('qwertyui')) // false console.log(reg.test('qwertyuiabc')) // true console.log(reg.test('1234567890')) // false
-
- 匹配
-
- 捕获
-
没有捕获到: 直接返回一个 null
-
const reg = /\d{3}/ console.log(reg.exec('zxcvbnm')) // null
-
-
捕获到了
-
2.1 没有小括号也没g 的情况, 永远捕获的都是下标0开始的第一个符合条件的
-
const reg = /\d{3}/ console.log(reg.exec('z123xc456vb789nm000')) console.log(reg.exec('z123xc456vb789nm000')) //['123', index: 1, input: 'z123xc456vb789nm000', groups: undefined]
-
-
2.2 没有小括号, 但是有修饰符g 的情况
- 第一次捕获完成后, 第二次开始的时候, 会从第一次捕获结束的位置开始
- 第三次开始的时候, 会从第二次捕获结束的位置开始
- 当所有的匹配项都匹配完成后, 会返回一个 null
- 当再次捕获的时候, 就从下标0重新开始
-
const reg = /\d{3}/g console.log(reg.exec('z123xc456vb789nm000')) // 123 console.log(reg.exec('z123xc456vb789nm000')) // 456 console.log(reg.exec('z123xc456vb789nm000')) // 789 console.log(reg.exec('z123xc456vb789nm000')) // 000 console.log(reg.exec('z123xc456vb789nm000')) // null console.log(reg.exec('z123xc456vb789nm000')) // 123
-
-
2.3 有小括号
- 下标0 还是我们正常捕获到的内容
- 从 下标1 开始, 就是每个小括号捕获到的内容
-
const reg = /(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/ const str = '411371200413141234' console.log(reg.exec(str))
-
正则的元字符
正则表达式的符号由那些组成?
-
- 元字符
- 正则表达式的规则符号
-
- 修饰符
- 修饰整个正则表达式的符号
元字符 - 普通元字符
1. \d 表示 一位(一个) 数字(0~9)
2. \D 表示 一位 非数字(除了0~9)
3. \w 表示 数字(0~9)字母(a-zA-Z)下划线(_) 其中的 一个
4. \W 表示 除了 数字(0~9)字母(a-zA-Z)下划线(_) 这些的 某一个字符
5. \s 表示 一位 空白字符
6. \S 表示 一位 非空白字符
7. . 表示 一位 非换行的任意字符
8. \ 表示转义符
* 把有意义的符号, 转为 没有意义的文本
* 将没有意义的文本, 转为 有意义的符号
正则的边界元字符
-
^ 表示开头
-
$ 表示结尾
-
const reg = /^\d/ // 表示字符串开头是一个数字 const reg1 = /\d$/ // 表示字符串结尾是一个数字 const reg2 = /^\d$/ // 表示字符串只能是一个数字
-
限定元字符
表示前边一个符号出现多少次
1. * 表示 0~正无穷次
2. + 表示 1~正无穷次
3. ? 表示 0~1次
4. {n} 表示 限定 n 次, 不能多也不能少
5. {n,} 表示 最少 n 次
6. {n,m} 表示 最少 n 次, 最多 m 次
正则的特殊元字符
-
- ()
- 含义1: 当成一个整体
- 含义2: 单独捕获(欠着)
-
- | 或 字符为 或 左右两边的 都行
-
- [] 包含 注意: [abcd] 包含其中一个即可 [] 实际代表的就是 一位字符
-
- [^] 非 注意: [^abcd] 只要不是他们四个中的一个即可 [^] 实际代表的就是 一位字符
- 5.到(至)
通常与包含和非一起使用
[0-9] 数字 0
9 中的一个 \d [^0-9] 不是数字 09 中的 一个 \D [a-z] 小写 字母az [A-Z] 大写 字母AZ
正则的重复元字符
符号: \1 \2 .... \9
代表第几个小括号的值
* /(abc|def)\1/
* 小括号 内 为 abc \1 这个位置也需要是 abc
* 小括号 内 为 def \1 这个位置也需要是 def
正则的标识符(修饰符)
- 书写在正则外边 用于描述整个正则表达式
-
- i
- 忽略大小写
-
- g
-
全局
const reg = /\d{3}/g const str = 'z123xc456vb789nm000' var arr = [] let newArr = reg.exec(str) console.log(newArr) while (newArr !== null) { // let num = newArr[0] - 0 // arr.push(num) arr.push(newArr[0]) newArr = reg.exec(str) } console.log(arr)
正则的两大特性
-
- 懒惰
- 正常捕获字符串的时候, 每次都从 下标0开始
- 解决方式: 给正则添加一个修饰符 g
-
- 贪婪
- 每次在捕获的时候, 会尽可能的多捕获一些东西
- 解决:
- 在原有的修饰符后添加一个 ? 然后相当于开启 非贪婪模式
- 贪婪: 能多拿就多拿
- 非贪婪: 能少拿就少拿
- 贪婪限定符
-
* + ? {n,} {n,m}
-
- 非贪婪限定符
-
*? +? ?? {n,}? {n,m}?
-