本文原创:liuchendi正则表达式
字面量方式建立数组
let reg = /元字符/修饰符bash
实例方式建立函数
letg reg = new RegExp('\d+',igm)//实例化建立正则的方式不须要加/(并不包括转义斜杠\),并把修饰符以第二个参数的形式传递给实例测试
经过实例方式建立的正则,其中特殊元字符须要再加上一个\,由于字符串中的\也是表明转义的意思,就会默认省略ui
let reg = new RegExp('\\b${cn}\\b')
复制代码
正则表达式没法识别连续的单词中的字符或者数字,他会默认把他们当作一个一个单独的字符去识别url
let reg = /[12-66]/ //表示1或2-6或5
复制代码
回车打下的换行还自带一个空格spa
当你要检测字符串\d时prototype
let reg = /\\d/
reg.test('\\d')
//字符串中的斜杠首先就是一个转义运算符,你要想测试\d
//字符串自己的\还要进行转义
复制代码
量词限制的是前面紧跟的某个字符出现的次数rest
let reg = /^[a-z]$/
console.log(reg.test('aa')) // false 注意:这个是表示一个字母既是开头又是结尾,而且是一个字母
复制代码
正则当中小括号改变优先级
let reg = /^a|b$/ //以a为开头或者以b为结尾
let reg3 = /^(a|b)$/ //至关于/^a$/或/^b$/
复制代码
分组捕获
分组引用
let reg = /^1(\d)\1\1$/
console.log(reg.test('1222')) // true
console.log(reg.test('1333')) // true
let reg2 = /^([a-z])([a-z])\2\1$/
console.log(reg2.test('abba')) // true
console.log(reg2.test('baba')) // false
复制代码
在这里如何计算他是第几个分组,就从左往右看,看他的左括号是第几个
正则捕获:将匹配到的内容,捕获出来,做为返回值返回给咱们。方法的位置:RegExp.prototype.exec()
他的返回值是一个数组,若是没有捕获到返回值为null
index、groups、input都是是正则捕获到的数组的自带属性,这个数组的长度为1
每次调用正则捕获或者匹配的时候都是从索引0处开始捕获的
let reg = /\d+/
let str = 'abc111 abc222 abc333'
reg.exec(str)// ["111", index: 3, input: "abc111 abc222 abc333", groups: undefined]
reg.exec(str)// ["111", index: 3, input: "abc111 abc222 abc333", groups: undefined]
reg.exec(str)// ["111", index: 3, input: "abc111 abc222 abc333", groups: undefined]
复制代码
取消正则的懒惰性,修饰符g(global),会从上一次匹配或者捕获成功的位置继续向后查找
若是捕获到结束边界 会从头再来
let reg = /\d+/g
let str = 'abc111 abc222 abc333'
console.log(reg.exec(str))
// ["111", index: 3, input: "abc111 abc222 abc333", groups: undefined] test:true
console.log(reg.exec(str))
// ["222", index: 10, input: "abc111 abc222 abc333", groups: undefined] test:true
console.log(reg.exec(str))
// ["333", index: 17, input: "abc111 abc222 abc333", groups: undefined] testLtrue
console.log(reg.exec(str))
// null test:false
console.log(reg.exec(str))
// ["111", index: 3, input: "abc111 abc222 abc333", groups: undefined] test:true
复制代码
lastIndex:他是正则实例上的一个属性,下一次开始查找的起始索引
lastIndex的值能够手动修改,可是若是没有修饰符g的时候,修改不会起做用
reg.lastIndex = 9
复制代码
不管是test仍是exec仍是混用,当加修饰符/g时,lastIndex属性都是起决定性的因素。
let reg = /\d+/
reg.exec('abc111 abc222 abc333') //111 index=3
reg.exec('a444 b555 c666') //555
复制代码
由于lastIndex是正则实例对象reg上的属性,换字符串并不会影响他下面私有属性的值
global属性是用来标识正则是否有g修饰符的,返回值时true和false
multline属性是否支持多行匹配
ignoreCase属性是否忽略大小写
sourse正则全部的元字符内容,不包括外界的两个斜杠
match支持正则,在他的底层封装的仍是exec,当没有取消正则懒惰性的状况下,他的返回值和exec相同,若是匹配不到返回值为null
若是取消了正则的懒惰性,match会以数组的形式将捕获到的结果一次性返回
正则的贪婪性:每一次捕获的时候老是捕获到知足当前正则的最长内容
取消正则的贪婪性:量词后面加?,按照最短的状况进行匹配
let reg = /\d{2,8}?/g
复制代码
数组返回的第一项始终是整个大正则捕获到的内容,若是有分组,会从第二项开始依次排列
let reg = /hello(\d+)/g
let str = 'hello2018 abc111 hello2019 abc222'
console.log(reg.exec(str))
// ["hello2018",2018, index: 0, input: "hello2018 abc111 hello2019 abc222", groups: undefined]
console.log(reg.exec(str))
// ["hello2019",2019, index: 0, input: "hello2018 abc111 hello2019 abc222", groups: undefined]
复制代码
若是不加g,因为match的底层就是exec,因此返回值和exec相同
若是加了g,因为match是一次性捕获,因此不能捕获分组内容的
取消分组
在小括号的前面加上一个(?:)只匹配,不捕获
let reg = /^(?:start|end)$/
复制代码
let reg = /^1(\d)\1$/
复制代码
\1是对分组1的再次引用,这里存在几个小问题,其一是引用的分组表示两个分组的内容相同,第二个是经过引用的分组经过RegExp.$拿不到
let reg = /^([a-z])\1([a-z]\1)$/
//aabb ccdd
复制代码
正向预查(?=元字符) 不会发生分组捕获 负向预查(?!元字符) 不会发生分组捕获
// 正向预查
// 捕获 后面跟着3或者4的字母
let reg1 = /[a-z](?=3|4)/g
let str1 = 'a1 b2 c3 d4'
console.log(str1.match(reg1)) //["c", "d"]
// 负向预查
// 捕获 后面跟着的不是3或者4的字母
let reg2 = /[a-z](?!3|4)/g
let str2 = 'a1 b2 c3 d4'
console.log(str2.match(reg2)) // ["a", "b"]
复制代码
捕获的不是预查的内容而是范围内的内容
正向预查或者负向预查若是放在开头的话,做用是限定后面的范围\d,\w,[]
let reg11 = /^((?=3)\d)+$/
console.log(reg1.test('3333')) // true限定数字只能为3
let reg2 = /^((?!4)\d)+$/g
console.log(reg2.test('1123123')) // true 限定数字里不能有4
console.log(reg2.test('11234123')) // false
console.log(reg2.test('11234566')) // false
复制代码
let reg = /^a.+b$/
let str = `a1b
a2b
a3b
`
reg.test(str)//false 由于没有以a为开头,b为结尾的
let reg1 = /^a.+b$/m
reg1.exec(str)//a1b 会把每一行都看做独立的一行进行匹配
reg1.exec(str)//a2b
reg1.exec(str)//a3b
复制代码
// let sss = '1a2b3c4'
// console.log(sss.split(/[a-z]/)) // [1, 2, 3, 4]
复制代码
replace的底层封装的也是exec,至关于自动的对exec进行遍历
let str = 'aaa2018 bbb2019'
let reg = /hello/ //若是加g,匹配到多少次,这个函数就会被执行几回
//他会把exec捕获到的值当作参数传递给这个函数
//这个函数的返回值就是replace捕获到的内容所要替换的值
str.replace(reg,(...rest)=>{
console.log(rest)
return 'AA'
})
复制代码
这个函数的返回值就是匹配到的内容要替换的新内容,有点相似于数组的map方法
let str2 = str.replace(/\d\b/g, a => a * 2)
//第一个参数是正则捕获到的内容,因为没有用扩展运算符,因此穿入的直接是变量而不是数组
复制代码
方法一
let reg = \(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})\
str.replace(reg,`$1年$2月$3日 $4时$5分$6秒`)
str.replace(reg,function(...rest){
return `${rest[1]}年${rest[2]}月${rest[3]}日`
})
复制代码
方法二
let time2 = time.split(/[-\s:]/)//[2019,20,1,11,56,56]
let text = ['年','月','日',' ','时','分','秒']
//forEach拼接
复制代码
方法三
let ary = time.match(/\d+/g)
let text = ['年','月','日',' ','时','分','秒']
ary.map()//遍历修改
复制代码
let newStr = str.split('').sort().join('')
let reg = /(\w)\1*/g
let obj = {}
newStr.replace(reg,function(){
obj[rest[1]] = obj[rest[0].length]
})
复制代码
let reg = /[?&]([^?&=]+)=([^?&=]+)/g
复制代码
function format (num) {
var reg=/\d{1,3}(?=(\d{3})+$)/g;
return (num + '').replace(reg, '$&,');
}
复制代码
let reg = /^1(36|58)\d{8}$/
复制代码
let reg = /^[+-]?(\d|[1-9]\d+)(\.\d+)?$/
复制代码
拆分为三段23-29,30-59,60-66
let reg = /(2[3-9])|([3-5]\d)|(6[0-6])/
复制代码
第一部分能够为\w和. - ,可是. -不能做为开头和结尾i,不能连续
第二部分域名只能为数字字母
let reg = /^\w+([-.]\w+)*@[\da-zA-Z]{2,6}(\.[a-z]{2,6}){1,2}$/
复制代码
function testType(data){
let str = Object.prototype.tostring.call(data)
let reg = /\[object (\w+)\]/
return str.exec(reg)[1].toLowerCase()
}
复制代码