字面量
// 默认单个匹配模式
let str="asf6767asdfasd787asf787fad777"
let reg=/\d+/
let res=str.match(reg)
//res ["6767", index: 3, input: "asf6767asdfasd787asf787fad777", groups: undefined]
// g:全局匹配模式
let str="asf6767asdfasd787asf787fad777"
let reg=/\d+/g
let res=str.match(reg)
//res (4) ["6767", "787", "787", "777"]
//构造函数创建
let str="asf6767asdfasd787asf787fad777"
let reg=RegExp('\\d+','g') //构造函数创建正则
let a="\\d+" //构造函数的正则,\d\s...需要➕\
let reg=RegExp(a,'g') //构造函数引入变量作为正则表达式,匹配模式g
let res=str.match(reg) //["6767", "787", "787", "777"]
正则方法 (正则式.test())
let str="ae3"
let reg=/\d+/ // +:1,多
let res=reg.test(str)
//res true 有没有g都一样,找到一个就完事
//匹配单个
let str="ae33ff22"
let reg=/\d+/
let res=reg.exec(str) //匹配单个,执行多次每次都是从头找
// res ["33", index: 2, input: "ae33ff22", groups: undefined]
//全局匹配
let str="ae33ff22"
let reg=/\d+/g // +:1,多
let res=reg.exec(str) //全局匹配,执行多次每次都是接着上次的找
// res ["33", index: 2, input: "ae33ff22", groups: undefined]
字符串方法(也可以用正则)
- split 截取
- replace 替换
- search 搜索
- match 匹配
// split 截取
let str="aaadddaafff345";
console.log(str.split('a')) //["", "", "", "ddd", "", "fff345"]
// replace 替换
let str="中国人口大教育部哈哈哈教育部"
let reg=/教育部|中国/g
let res=str.replace(reg,function(arg){
console.log(arg) //符合正则的字符串
return '*'.repeat(arg.length) // '*'.repeat(n)重复字符串n次
})
// search 搜索
// 查找第一个符合结果的索引位置;找不到返回-1;忽略全局匹配
let str='fafafafdfsag899'
let reg=/\d+/;
let res=str.search(reg);
console.log(res)//12
// match 匹配
let str="fafa33fafdfsag899"
let reg=/\d+/; //匹配单个 match详细
let res=str.match(reg)
console.log(res) // ["33", index: 4, input: "fafa33fafdfsag899", groups: undefined]
let str="fafa33fafdfsag899"
let reg=/\d+/g; //匹配全局 match返回数组
let res=str.match(reg)
console.log(res) // ["33", "899"]
元字符:正则中有特殊含义的非字母字符
// . => 匹配除了 \n \r \u2028段落结束符 \u2029行结束符之外的字符
//有回车符
let str=`<div>somed
dss99..</div>`
//表达式里有/结尾符 需要用转义字符 "\"转义:将特殊含义转换成字面量含义;
let reg=/<div>.*<\/div>/g;
let res1=reg.test(str)
console.log(res1) //false
// * => 0,多 有或无,有就多
// + => 1,多 至少有一个
// ? => 0,1 有或无,有且只有1个
// ?+是对?进行1次或多次,引起误解
//不是全局匹配的话 执行多次也是匹配1次然后重新开始
//全局匹配:找到1个符合条件的,记住最后一个索引,接着找
// ^:开头 $:结尾 \w:数字 字母 下划线
let str='cfdsaf3lcrrrlcgsl'
let reg=/^c\w+l$/g //c开头 l结尾 中间至少数字/字母/下划线
let res=reg.test(str) //true
let res1=reg.test(str) //false 只能找到一个???
// []:“字符集合-或” /[ab]/ <=> /a|b/
// [^]^在[]里时,当非讲,即除了[]里面字符串之外的
let str="abcd1234abcdcsd"
let reg=/c|d/g
let reg1=/[cd]/g //c|d
let reg2=/[^cd]/g // 除了c d
let a=str.replace(reg,'*') // "ab**1234ab***s*"
let b=str.replace(reg1,'*') // "ab**1234ab***s*"
let v=str.replace(reg2,'*') // "**cd******cdc*d"
// [0-9]:0-9
// [0-20]: 0-2|0
let str="03ppp2ppp43pp02p0pp"
let reg=/\d+/g //至少一个的数字,连续匹配
let reg1=/[0-9]+/g //等价于上面
let reg2=/[0-20]+/g //0-2|0 1个字母1个字母的匹配
str.match(reg) // ["03", "2", "43", "02", "0"]
str.match(reg1) // ["03", "2", "43", "02", "0"]
str.match(reg2) // ["0", "2", "02", "0"]
// ?
let str="this fff is 6kkm"
let reg=/[KkCc]?[mM]/
let res=str.replace(reg,'米') // this fff is 6k米
// 第一个k后面没有m|M,没匹配上
// km匹配上了,换成了‘米’
// . <=> [^\r\n\u2028\u2029]
// \d <=> [0-9]
// \w <=> [a-zA-Z_0-9] 数字 字母 下划线
// ? <=> {0,1} 0|1
// + <=> {1,} 至少一次,无上限
// * <=> {0,} 0,多
// {3} 重复3次
// {} => 重复次数
let str="this fff /is 6m"
let reg=/\bis\b/g //边界 id 边界
let res=str.match(reg) //[is]
let str="this fff /is 6m"
let reg=RegExp('\\bis\\b','g') //构造函数里的正则,\要用\转义一下
let res=str.match(reg) //[is]
//{3} 重复次数
let reg1=/s{3}/g; //s重复3次
let reg2=/ab{2}/g; //b重复2次
let reg3=/(ab){2}/g; //ab重复2次
//()分组
let str4="my nama is LiLei"
let reg4=/LiL|lei/ // | 或字符会隔开前后字符串
// /Li(L|l)ei/ <=> /Li[Ll]ei/ //变成了 Li+L|i+ei
let res3=str4.replace(reg4,'李雷')
// 反向引用 1.用()分组 2.$1 $2 $3 加引号
let time="2019-10-21"
let reg=/(\d{4})-(\d{1,2})-(\d{1,2})/g
let res=time.replace(reg,"$3/$2/$1") //"$3/$2/$1" $是特殊字符
console.log(res) //21/10/2019
console.log(RegExp.$1) //2019
//分组命名 Es2018
let str="$name=zhang&age=19"
// let reg=/\$\w+/g //$需要转义
let reg=/\$(?<str1>\w+)/ //$需要转义
//匹配以$开头+数字字母下划线,只匹配数字字母下划线
let res=str.match(reg)//分组只有在单个模式匹配才会体现res.groups.str1
零向断言 正向(后面) 负向(前面) ==> true/false
肯定:正常 否定:符合表达式字符串其他的部分
// 零向断言 正向(后面) 负向(前面) ==> true/false
// 正向肯定断言 正则表达式的后面 (?=表达式) 匹配的时候匹配上,替换的时候不替换
let str="iphone1iphone3iphone3iphoneNum"
// let reg=/iphone\d{1,2}/g //🍎🍎🍎iphoneNum
let reg=/iphone(?=\d{1,2})/g //🍎1🍎3🍎3iphoneNum 匹配整个表达式,不替换后面的
let res=str.replace(reg,'🍎')
// 正向否定断言 正则表达式的后面 (?!表达式) 除了符合表达式的字符串的其他部分
let str="iphone1iphone3iphone3iphoneNum"
let reg=/iphone(?!\d{1,2})/g
let res=str.replace(reg,'🍎') //iphone1iphone3iphone3🍎Num
// 负向断言
// 负向肯定断言 正则表达式的前面 (?<=表达式) 匹配的时候匹配上,替换的时候不替换
let str="10px20px30pxipx"
// px==>像素
// let reg=/px/g
// let reg=/\d{2}px/g
let reg=/(?<=\d{2})px/g //匹配带有数字+px的,只替换px
let res=str.replace(reg,'像素') // "10像素20像素30像素ipx"
// 负向否定断言 正则表达式的前面 (?<!表达式)
let str="10px20px30pxipx"
let reg=/(?<!\d{2})px/g
let res=str.replace(reg,'像素') // "10px20px30pxi像素"
//匹配整个表达式,不替换()部分
//正向肯定 (?=表达式) 表达式的后面,
//正向否定 (?!表达式) 表达式的后面,正则式取非
//负向肯定 (?<=表达式) 表达式的前面,
//负向否定 (?<=表达式) 表达式的前面,正则式取非
匹配模式
//g:全局匹配
//i:忽略大小写
//m:多行模式
{
let str="abcdAd"
let reg=/a/gi //匹配模式:全局;忽略大小写
let res=str.replace(reg,'*')
console.log(res)
let str1=`abc
dAd`
let reg1=/^\w/gm
let res1=str1.replace(reg1,'*')
console.log(res1)
}
{
let str=`<div>somed
dss99..</div>`
// let reg=/<div>.*<\/div>/g; //.:匹配除了 \n \r \u2028段落结束符 \u2029行结束符之外的字符 ,但这个地方有换行,所以匹配不上
let reg=/<div>.*<\/div>/gs; //s 匹配换行 true
let res1=reg.test(str)
console.log(res1)
}
{
// u:匹配unicode编码
console.log(/^.$/u.test("\ud842\udf87"))
// y:粘性模式 匹配正则中lastindex属性指定位置的字符,并且如果没有匹配也不会尝试从任何后续的索引中进行匹配
}