创建正则
- 定义:我们自己来书写规则,然后专门用来检测 字符串 是否符合规则
- 创建正则
- var reg = /正则在这里面/
- var reg = new RegExp('正则写在这里面')
var reg = /abc/
console.log(reg)
var reg2 = new RegExp('abcd')
console.log(reg2)
正则的常用方法
- 匹配
- test 匹配字符串是否符合正则规则
- true 符合规则 (包含且连在一块)
- false 不符合规则
var reg = /abc/
var str1 = 'a'
var str2 = 'ab'
var str3 = 'abc'
var str4 = 'abcd'
var str5 = 'a1b2c3d'
console.log(reg.test(str1))
console.log(reg.test(str2))
console.log(reg.test(str3))
console.log(reg.test(str4))
console.log(reg.test(str5))
- 捕获
正则的元字符
普通元字符
- \d 表示 一位 数字(0-9)
var reg = /\d/
console.log(reg.test('abcd'))
console.log(reg.test('abcd$%^#$%#'))
console.log(reg.test('123456789'))
- \D 表示 一位 非数字(除了0-9)
var reg = /\D/
console.log(reg.test('abcd'))
console.log(reg.test('abcd$%^#$%#'))
console.log(reg.test('123456789'))
- \s 表示 一位 空白内容(空格, 缩进)
var reg = /\s/
console.log(reg.test('123456789%^&%^$qwert'))
console.log(reg.test('123456789% ^&%^$qwert'))
- \S 表示 一位 非空白内容
var reg = /\S/
console.log(reg.test('123456789%^&%^$qwert'))
console.log(reg.test('123456789% ^&%^$qwert'))
console.log(reg.test(' '))
- \w 表示 一位 数字(0-9)字母(a-z A-Z)下划线(_)
var reg = /\w/
console.log(reg.test('abc'))
console.log(reg.test('a1b2c3'))
console.log(reg.test('a1b_2c3'))
console.log(reg.test('@$%#^%$^'))
- \W 表示 一位 非数字字母下换线
var reg = /\W/
console.log(reg.test('abc'))
console.log(reg.test('a1b2c3'))
console.log(reg.test('a1b_2c3'))
console.log(reg.test('@$%#^%$^'))
console.log(reg.test(' '))
- . 表示 一位 非换行内容
var reg = /./
console.log(reg.test('#%^#%$^'))
console.log(reg.test('asdf'))
console.log(reg.test('1234'))
console.log(reg.test('\n'))
- \ 表示 转义符
var reg = /\d\.\d/
console.log(reg.test('abc'))
console.log(reg.test('5.7'))
console.log(reg.test('100'))
正则的边界元字符
- ^ 表示开头
var reg = /^\d/
console.log(reg.test('100abc'))
console.log(reg.test('abc100'))
- $ 表示结尾
var reg = /\d$/
console.log(reg.test('100abc'))
console.log(reg.test('abc100'))
- 注意:当开头与结尾 共同使用时,表示 字符串 必须是 规则里的内容
var reg = /abc/
console.log(reg.test('abcd'))
var reg1 = /^abc$/
console.log(reg1.test('abcd'))
正则的限定元字符
- *表示 0~正无穷次
var reg = /^\d*$/
console.log(reg.test('abc'))
console.log(reg.test('_99'))
console.log(reg.test('666'))
- +表示 1~正无穷次
var reg = /^\d+$/
console.log(reg.test('abc'))
console.log(reg.test('_99'))
console.log(reg.test('666'))
console.log(reg.test(' '))
console.log(reg.test('!'))
- ?表示 0~1 次
var reg = /^\d?$/
console.log(reg.test('6'))
console.log(reg.test('99'))
- {n} 表示 限定n 次
var reg = /^\d{3}$/
console.log(reg.test('6'))
console.log(reg.test('99'))
console.log(reg.test('999'))
console.log(reg.test('9999'))
- {n,} 表示 限定最少n 次
var reg = /^\d{3,}$/
console.log(reg.test('6'))
console.log(reg.test('99'))
console.log(reg.test('999'))
console.log(reg.test('9999'))
- {n,m} 表示 限定最少n 次, 最多 m 次
var reg = /^\d{3,4}$/
console.log(reg.test('6'))
console.log(reg.test('99'))
console.log(reg.test('999'))
console.log(reg.test('9999'))
console.log(reg.test('99991'))
正则的特殊元字符
- ()
var reg = /^(abc){2}$/
console.log(reg.test('abc'))
console.log(reg.test('abcabc'))
console.log(reg.test('abcqwe'))
- |
var reg = /a|b/
console.log(reg.test('a'))
console.log(reg.test('b'))
console.log(reg.test('c'))
- 元字符或的分界线在哪里
var reg = /^abc|def$/
console.log(reg.test('abc123456789'))
console.log(reg.test('123456789def'))
console.log(reg.test('1234abcdef56789'))
var reg = /^ab(c|d)ef$/
console.log(reg.test('abcef'))
console.log(reg.test('abdef'))
console.log(reg.test('qwef'))
console.log(reg.test('abqwe'))
- [] 包含 中括号内其中一个即可
- 在中括号中可以书写任意数量的符号,但是字符串中只要满足其中一个即可
var reg = /^[abcd]$/
console.log(reg.test('a'))
console.log(reg.test('b'))
console.log(reg.test('c'))
console.log(reg.test('d'))
console.log(reg.test('ab'))
console.log(reg.test('abcd'))
- [^] 非 不包含
- 在中括号内可以书写任意数量的字符,只要字符串不是其中的某一个就行
var reg = /^[^abcd]$/
console.log(reg.test('a'))
console.log(reg.test('ab'))
console.log(reg.test('abc'))
console.log(reg.test('abcd'))
console.log(reg.test('abdw'))
console.log(reg.test('aw'))
console.log(reg.test('w'))
- -到 至
- 通常和 [] [^] 连用
- /[0-9]/ 正则代表的含义 数字 0-9, 等价于 \d
- /[^0-9]/ 正则代表的含义 非数字 0-9, 等价于 \D
- /[a-z]/ 正则代表的含义 字母 a-z
- /[0-9a-zA-Z_]/ 等价于 \w
正则的重复元字符
- 符号: \数字
- 含义: 表示重复第 n 个小括号的内容,并且要求和小括号的内容完全一致
var reg = /^(abc|def)\1$/
console.log(reg.test('abcabc'))
console.log(reg.test('defdef'))
console.log(reg.test('abcdef'))
console.log(reg.test('defabc'))
正则的标识符
- i
- g
var reg = /^[abcd]$/i
console.log(reg.test('a'))
console.log(reg.test('A'))
console.log(reg.test('w'))
正则的捕获
- 字符串没有符合正则规则的内容
var reg = /\d{3}/
console.log(reg.exec('qwertyuiop'))
- 正则没有小括号,没有标识符 g
- 捕获到的是一个数组,下标0 是我们捕获到的值,但是不管捕获多少次,都是从 [0]开始,第一个满足条件的
var reg = /\d{3}/
console.log(reg.exec('qwe123rt456yui789op'))
console.log(reg.exec('qwe123rt456yui789op'))
- 有小括号
- 下标0 是符合正则规则的字符串
- 从 下标1 开始,是每个小括号单独捕获出来的内容
var reg = /(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/
var num = '140423200401311234'
console.log(reg.exec(num))
- 有标识符g
- g 叫做全局标识符
- 第二次捕获的时候,会从第一次捕获结束的位置开始进行捕获
- 直到找不到内容会返回一个 null
- 然后再下一次捕获的时候,会从字符串开始位置重新捕获
var reg = /\d{3}/g
var str = 'qwe123rt456yui789op'
console.log(reg.exec(str))
console.log(reg.exec(str))
console.log(reg.exec(str))
console.log(reg.exec(str))
console.log(reg.exec(str))
正则的两大特性
- 懒惰
- 每次捕获 都是在 下标[0] 的位置开始捕获
- 解决: 在正则后添加全局标识符 g
- 贪婪
- 每次捕获内容的时候,尽可能多去捕获内容
- 解决: 使用非贪婪限定符(在原有的限定符后添加一个?)
var str = '<div class="box" id="id_box"><span></span></div>'
var reg1 = /<div.*>/
console.log(reg1.exec(str)[0])
var reg2 = /<div.*?>/
console.log(reg2.exec(str)[0])
正则创建方式的区别
- 书写标识符
- 字面量的方式,直接在正则后书写标识符
- 内置构造函数的方式,需要写在第二个参数中
let reg1 = /abc/ig
let reg2 = new RegExp('qwe','ig')
- 书写元字符
let reg1 = /\d\w.\./
console.log(reg1)
let reg2 = new RegExp('\\d\w')
console.log(reg2)
* 在字符串中,如果书写了\ 那么相当于转义符,将后边的字符转换为有意义的字符
* 但是转换完成之后, \ 就会自动消失,那么正则拿到的就是一个具有特殊意义的字符 d
* 但是又因为 正则中元字符必须是 \ + d 结合在一起才是一个元字符,如果只有一个 d 那么就是一个普通的字母,没有任何 特殊含义
* **解决方式**:
* 在原本的反斜杠\ 前 再添加一个\
* 第一个\ 将第二个\ 转换为没有任何意义的普通文本,最终拿到的就是一个 没有特殊含义的 \ + d
* 然后按照正则的规则中,\+d就是一个元字符代表的是数字0-9