正则表达式
正则表达式又名“规则表达式”。
是由我们来书写 “规则”,专门用来检测 字符串 是否符合 “规则” 使用的。
我们使用一些特殊的 字符 或者 符号 定义一个 "规则公式", 然后用我们定义好的 "规则公式" 去检测 字符串 是不是合格。
正则表达式的符号有两种符号组成:
1.元字符
正则的规则符号
普通文本
2.修饰符
修饰整个正则表达式的符号
创建正则表达式
1. var reg = /此处为正则/
例:var reg = /abc/
2. var reg = new RegExp('此处为正则')
例: var reg1 = new RegExp('abcd')
正则表达式的常用方法
1. 匹配
关键字: test
匹配字符串是否符合正则规则
返回结果:
true
false
例:
var reg = /werl/
var str1 = 'qwerl'
var str2 = 'moqlwienr2'
var str3 = 'lomjwerlt3'
console.log(reg.test(str1))
console.log(reg.test(str2))
console.log(reg.test(str3))
2.捕获
语法: 正则.exec(字符串)
1. 字符串没有符合正则规则的内容
捕获结果为 null
例: var reg = /\d{3}/
console.log(reg.exec('qwertyuiop'))
2. 正则没有小括号, 没有标识符 g
捕获到的是一个 数组, 下标 0 是我们捕获到的值, 但是不管捕获多少次, 都是从 下标[0]开始, 第一个满足条件的
例: var reg = /\d{3}/
console.log(reg.exec('qwe123rtyu456iop999'))
console.log(reg.exec('qwe123rtyu456iop999'))
3. 有小括号
下标0 是符合正则规则的字符串
从 下标1 开始, 每个小括号单独捕获出来的内容
例: var reg = /(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/
var num = '130432199505020056'
console.log(reg.exec(num))
4. 有标识符 g
g 叫做全局标识符
第二次捕获的时候, 会从第一次捕获结束的位置开始进行捕获
直到找不到内容, 会返回一个 null
然后在下一次捕获的时候, 会从字符串开始位置重新捕获
例: var reg = /\d{3}/g
var str = 'qwe123rtyu456iop999'
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))
正则表达式的元字符
一、普通元字符
1. \d 表示匹配(包含) 一位 数字(0~9)
例: var reg = /\d/
console.log(reg.test('abcd'))
console.log(reg.test('qwe25f'))
2. \D 表示匹配(包含) 一位 非数字(0~9以外)
例: var reg = /\D/
console.log(reg.test('abcd'))
console.log(reg.test('qwe25f'))
console.log(reg.test('15235422'))
console.log(reg.test(' '))
console.log(reg.test(''))
3. \s 表示匹配(包含) 一位 空白内容(空格,缩进)
例: var reg = /\s/
console.log(reg.test('sknnggi25455n'))
console.log(reg.test('skfdsf 2665safjh'))
console.log(reg.test(''))
4. \S 表示匹配(包含) 一位 非空白内容
例: var reg = /\S/
console.log(reg.test('vddiw125 sjdhsa'))
console.log(reg.test('sjdaf1saf52fas'))
console.log(reg.test(' '))
console.log(reg.test(''))
5. \w 表示匹配(包含) 一位 数字(0~9)字母(a~zA~Z)下划线(_)
例: var reg = /\w/
console.log(reg.test('彭于晏'))
console.log(reg.test('彭于晏 eddie'))
console.log(reg.test('#@%$^#&'))
console.log(res.test('12sfsf_sad'))
6. \W 表示匹配(包含) 一位 非数字字母下划线
例: var reg = /\W/
console.log(reg.test('彭于晏'))
console.log(reg.test('Eddie _ #$@@##'))
console.log(reg.test('sadasfxz'))
console.log(reg.test(' '))
7. . 表示匹配(包含) 一位 非换行的任意字符
例: var reg = /./
console.log(reg.test('\n'))
console.log(reg.test('qwert'))
console.log(reg.test('152as5dc'))
console.log(reg.test('@#$%&'))
8. \ 表示转译符号, 把有意义的 符号 转换成没有意义的 字符 , 把没有意义的 字符 转换成有意义的 符号
例: var reg = /\d\.\d/
console.log(reg.test('qwe'))
console.log(reg.test('6.9'))
console.log(reg.test('c.e.5.30'))
console.log(reg.test('s.f'))
console.log(reg.test('200'))
二、边界元字符
1. ^ 表示开头
例: var reg = /^\d/
console.log(reg.test('999zzz'))
console.log(reg.test('zzz999'))
2. $ 表示结尾
例: var reg = /$\d/
console.log(reg.test('999zzz'))
console.log(reg.test('zzz999'))
例: var reg = /^qwer$/
console.log(reg.test('qwert'))
注: 当 开头和结尾 同时使用时, 表示字符串 必须是 规则里的内容
三、限定元字符
限定了 前一个符号 出现多少次
1. * 表示 0~正无穷 次
例: var reg = /^\d*$/
console.log(reg.test('qwer'))
console.log(reg.test('_999'))
console.log(reg.test('999'))
2. + 表示 1~正无穷 次
例: var reg = /^\d+$/
console.log(reg.test('abc'))
console.log(reg.test('_999'))
console.log(reg.test('999'))
console.log(reg.test(' '))
console.log(reg.test('!'))
3. ? 表示 0~1 次
例: var reg = /^\d?$/
console.log(reg.test('6'))
console.log(reg.test('99'))
4. {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'))
5. {n,} 表示 限定 最少 n 次
例: var reg = /^\d{n,}$/
console.log(reg.test('6'))
console.log(reg.test('99'))
console.log(reg.test('999'))
console.log(reg.test('9999'))
6. {n,m} 表示 限定 最少 n 次,最多 m 次
例: var reg = /^\d{2,5}$/
console.log(reg.test('6'))
console.log(reg.test('99'))
console.log(reg.test('999'))
console.log(reg.test('9999'))
console.log(reg.test('99999'))
console.log(reg.test('999999'))
特殊元字符
1. ()
含义1: 单独捕获
含义2: 一个整体
例: var reg = /^(abc){2}$/
console.log(reg.test('abc'))
console.log(reg.test('abcabc'))
console.log(reg.test('abcqwe'))
console.log(reg.test('abcqwerabc'))
2. |
含义: 或
例: var reg = /a|b/
console.log(reg.test('a'))
console.log(reg.test('b'))
console.log(reg.test('c'))
console.log(reg.test('ab'))
console.log(reg.test('aqwrqfjb'))
3. []
含义: 包含 中括号内 其中一个 即可
在中括号内可以书写任意数量的符号, 但是字符串只要满足其中一个即可
例: var reg = /^[abcd]$/
* 分析:
* 字符串中 包含a b c d任意一个即可
console.log(reg.test('a'))
console.log(reg.test('b'))
console.log(reg.test('c'))
console.log(reg.test('d'))
console.log(reg.test('abcd'))
4. [^]
含义: 非 不包括
在中括号内可以书写任意数量的符号, 只要字符串不是其中一个即可
例: var reg = /^[^abcd]$/
console.log(reg.test('a'))
console.log(reg.test('c'))
console.log(reg.test('w'))
5. -
含义: 到 至
通常和 [] [^] 连用
/[0-9]/ 正则代表的含义 数字0~9, 等价于 \d
/[^0-9]/ 正则代表的含义 非数字0~9, 等价于\D
/[a-z]/ 表示字母 a~z
/[0-9a-zA-Z] 等价于 \w
元字符或的分界线
或的分界线为 小括号 或者 正则的边界
例: var reg = /^abc|def$/
* 分析:
* /^abc|def$/
* ^abc 或者 def$
console.log(reg.test('abc545214d'))
console.log(reg.test('jdhfd558def'))
console.log(reg.test('5254defasffa'))
console.log(reg.test('abc58465def'))
var reg = /^ab(c|d)ef$/
* 分析
* ^ab c ef$
* ^ab d ef$
console.log(reg.test('abcef'))
console.log(reg.test('abccef'))
console.log(reg.test('abdef'))
console.log(reg.test('abcdef'))
console.log(reg.test('qwef'))
console.log(reg.test('abkomlef'))
重复元字符
符号: \数字
例: \1 \2 \3
含义: 表示 重复 第 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'))
标识符(修饰符)
书写在正则外面, 用来描述整个正则表达式
1. i 表示忽略大小写
例: var reg = /^[abcd]$/i
console.log(reg.test('A'))
console.log(reg.test('a'))
2. g 表示 全局
正则表达式的两大特性
1. 懒惰
每次捕获 都是在 下标[0] 的位置开始捕获
解决: 在正则后添加个全局标识符 g
2.贪婪
每次捕获内容的时候, 尽可能的多去捕获内容
解决: 使用非贪婪限定符 (在原有的限定符后添加一个?)
贪婪限定符:
*
+
?
{n,}
{n,m}
非贪婪限定符:
*?
{n,}?