js基础知识 —— 正则表达式
- 什么是正则?
- 我们自己来书写规则,然后专门检测字符串是否符合规则
一、创建正则表达式
- 方法一:
var reg = /正则的内容/ - 方法二:
var reg = new RegExp(正则的内容)
二、正则的常用方法
1.匹配
- test 匹配字符串是否符合正则规则
- 返回值为布尔值 (true / false)
- 语法:
reg.test(str1) //匹配str1中是否包含正则内容
var reg = /asd/ //匹配一段字符串是否包含asd
var str1 = 'a'
var str2 = 'as'
var str3 = 'asd'
var str4 = 'asdf'
var str5 = 'as1d2'
console.log(reg.test(str1)) //false
console.log(reg.test(str2)) //false
console.log(reg.test(str3)) //true
console.log(reg.test(str4)) //true(包含即可)
console.log(reg.test(str5)) //false
2.捕获
- 语法:
正则.exec(字符串)
情况1:字符串中没有符合正则规则的内容,捕获结果为null
var reg = /\d{3}/
console.log(reg.exec('qwriryop')) //null
情况2:正则没有小括号,没有标识符g
- 捕获结果:为一个数组,下标0是我们捕获到的值,不管捕获多少次,都是从下标[0]开始,第一个满足条件
var reg = /\d{3}/
console.log(reg.exec('qwr123iry456opmnvx789')) // [0]123
console.log(reg.exec('qwr123iry456opmnvx789')) // [0]123
情况3:有小括号
- 捕获结果:下标0是符合正则规则的字符串,从下标1开始,是每个小括号单独捕获出来的内容
var reg = /(\d{4})(\d{4})(\d{4})(\d{4})(\d{2})/
var num = '142723199912062222'
console.log(reg.exec(num))
情况4:有标识符g (g全局标识符)
- 捕获结果为一个数组,第二次捕获时,会从第一次捕获结束的位置开始进行捕获,直到找不到内容会返回一个null,然后下一次会从字符串开始位置重新开始捕获
var reg = /\d{3}/g
var str = 'qwr123iry456ovx789'
console.log(reg.exec(str)) //[0]123
console.log(reg.exec(str)) //[1]456
console.log(reg.exec(str)) //[2]789
console.log(reg.exec(str)) //null
console.log(reg.exec(str)) //[0]123 一次类推
三、正则的元字符
1.普通元字符
-
\d表示一位数字(范围 0~9)var reg = /\d/ console.log(reg.test('asd')) //F console.log(reg.test('asd12')) //T console.log(reg.test('13654')) //T -
\D表示一位非数字( 除了0~9)var reg = /\D/ console.log(reg.test('asd')) //T console.log(reg.test('asd12')) //T console.log(reg.test('13654')) //F -
\s表示一位空白内容var reg = /\s/ console.log(reg.test('as dl')) //T console.log(reg.test('asd12')) //F console.log(reg.test('13 65 4')) //T -
\S表示一位非空白内容var reg = /\S/ console.log(reg.test('as dl')) //T console.log(reg.test('asd12')) //T console.log(reg.test(' ')) //F -
\w表示一位 数字 字母 下划线(包含一个即可)var reg = /\w/ console.log(reg.test('as dl_')) //T console.log(reg.test('asd12')) //T console.log(reg.test('&&_')) //T console.log(reg.test('&&!$&*')) //F -
\W表示一位空白内容var reg = /\W/ console.log(reg.test('asdl_')) //F console.log(reg.test('asd12')) //F console.log(reg.test('a&_1')) //T console.log(reg.test('&&!$&*')) //T -
.表示一位非换行内容var reg = /./ console.log(reg.test('&& _')) //T console.log(reg.test('asdj')) //T console.log(reg.test('1265')) //T console.log(reg.test('\n')) //F (\n表示换行) -
\表示转义 将有意义的转换为没意义的(. \d 转义后仅为 . 和 d)var reg = /\d\.\d/ // 表示小数 几.几 console.log(reg.test('&& _')) //F console.log(reg.test('132')) //F console.log(reg.test('1.2')) //T console.log(reg.test('Adg')) //F
2.边界元字符
-
^表示开头var reg = /^\d/ //表示数字开头 console.log(reg.test('12Adg')) //T console.log(reg.test('as12')) //F -
$表示结尾var reg = /\d$/ //表示数字结尾 console.log(reg.test('12Adg')) //F console.log(reg.test('as12')) //T
**注:^ $ 一起使用时,字符串的内容必须与正则内容相同
var reg = /^asd$/ //表示字符串必须是asd
console.log(reg.test('asd')) //T
console.log(reg.test('asdfv')) //F
3.限定元字符(限定前一个符号出现多少次)
*表示0~正无穷 次
var reg1 = /^\d$/ //只能出现一个数字
var reg = /^\d*$/ //长度 0~无穷 全为数字
console.log(reg.test('asd')) //F
console.log(reg.test('12asd32')) //F
console.log(reg.test('127896')) //T
console.log(reg.test('')) //T
+表示1~正无穷 次
var reg = /^\d*$/ //长度 1~无穷 全为数字
console.log(reg.test('asd')) //F
console.log(reg.test('12asd32')) //F
console.log(reg.test('127896')) //T
console.log(reg.test('6')) //T
console.log(reg.test('')) //F
?表示 0~1 次
var reg = /^\d?$/ //长度 0~1 全为数字
console.log(reg.test('12asd32')) //F
console.log(reg.test('127896')) //F
console.log(reg.test('6')) //T 1次
console.log(reg.test('')) //T 0次
{n}表示限定n 次
var reg = /^\d{3}$/ //长度3 全为数字
console.log(reg.test('12asd32')) //F
console.log(reg.test('127')) //T 3次
console.log(reg.test('6')) //F 1次
console.log(reg.test('')) // F 0次
{n,}表示限定最少n 次 [n,正无穷)
var reg = /^\d{3,}$/ //长度 >=3 全为数字
console.log(reg.test('12asd32')) //F
console.log(reg.test('127896')) //T
console.log(reg.test('666')) // T 1次
console.log(reg.test('')) //F 0次
{n,m}表示限定最少n次,最多m次 [n,m]
var reg = /^\d{3,5}$/ //长度 >=3 <=5 全为数字
console.log(reg.test('12asd32')) //F
console.log(reg.test('12345')) //T
console.log(reg.test('666')) // T 1次
console.log(reg.test('1234')) //T 0次
4.特殊元字符
- ( ) 小括号
- 含义1——单独捕获
- 含义2——一个整体
//一个整体
var reg = /^(asd){2}$/
console.log(reg.test('asdasd')) //T
console.log(reg.test('asdqwe')) //F
console.log(reg.test('asd')) //F
- | 或
var reg = /a|b/ //有a/b就行
console.log(reg.test('a')) //T
console.log(reg.test('b')) //T
console.log(reg.test('p')) //F
console.log(reg.test('ab')) //T
console.log(reg.test('ADFGad')) //T
3.[ ] 包含[ ]内其中一个即可(注:全部包含也是错的,只能是一个)
var reg = /^[asdf]$/ //字符串是asdf中的一个就行
console.log(reg.test('a')) //T
console.log(reg.test('s')) //T
console.log(reg.test('d')) //T
console.log(reg.test('f')) //T
console.log(reg.test('asdf')) //F
4.[^]非 不包含[ ]中的符号即可 (只能是1个)
var reg = /^[^asd]$/ //字符串不是asdf中的一个就行
console.log(reg.test('a')) //F
console.log(reg.test('s')) //F
console.log(reg.test('d')) //F
console.log(reg.test('f')) //T
console.log(reg.test('asd')) //F
-到、至 ,通常与[ ][^]连用
[0-9] === /d (代表0~9)
[^0-9] === /D
[0-9a-zA-Z_] === /w
5.重复元字符
- 符号:\数字
- 含义:重复第n个小括号里面的内容,并且要求和小括号里的内容完全一致
var reg = /^(ab|cd)\1$/
console.log(reg.test('abab')) //T
console.log(reg.test('cdcd')) //T
console.log(reg.test('abcd')) //F
console.log(reg.test('cdab')) //F
案例练习:要求字符串是span/p标签
var reg = /<(span|p)><\/\1>/
console.log(reg.test('<span></span>')) //T
console.log(reg.test('<p></p>')) //T