1、几个重要的含义
.*?: 其中,.表示匹配除换行符 \n 之外的任何单字符,*表示出现0次或多次,?表示非贪婪模式,就是匹配尽可能少的字符,就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。
.+?: 其中,.与?和上述描述一致,+则表示匹配至少有一个字符。
[\s\S]*?: 上述中.不能够匹配换行符,但是\s\S可以用于匹配任意字符。
(?=p):在p前面的位置
(?<=p):p后面的位置
(?!p):除了p其他元素前面的位置
(?<!p):除了p之外的元素后面的位置
(?=^):开头位置
(?!^):非开头位置 【 (?!^...):开头位置不能是...】。
(?!xxxx): 不能匹配xxxx
(?:):非捕获型分组,表示不存储匹配的值,可用于减少匹配过程中可消除的重复。(/^abc|^def/修改成/^(?:abc|def)/,/this|that/修改成/th(?:is|at)/)
2、具体举例描述
(1)匹配标签中的id,或者其他属性。
str.match(/(?<=id=\")(.*?)(?=\")/g)[0] id="123" ---> 123
"需要使用转义符\"。?<=用于匹配id="后面的位置,?=用于匹配"前面的位置。
(2)匹配标签中的内容。
str.match(/(?<=\>)([\s\S]*?)(?=\<\/)/g)[0] <li>abc</li> ---> abc
(3)匹配获取某种标签。
str.match(/<li([\s\S]*?)<\/li>/g) 数组:[<li id="123">abc</li>,...]
3、正则匹配某些内容进行替换(回溯引用)
分组体现在:所有以(和)元字符所包含的正则表达式被分为一组,每一个分组都是一个子表达式,它也是构成高级正则表达式的基础。如果只是使用简单的(regex)匹配语法本质上和不分组是一样的,如果要发挥它强大的作用,往往要结合回溯引用的方式。
所谓回溯引用(backreference)指的是模式的后面部分引用前面已经匹配到的子字符串。
可用$1,$2...来引用要被替换的字符串。
举例:
(1)将匹配到的组中内容添加其他内容进行替换。
let str = 'abc abc 123';
str.replace(/(ab)c/g,'$1g'); ----> abg abg 123
$1为匹配到的ab,将abc替换成abg
(2)实际的场景需要将某些搜索关键词在结果中高亮显示
let str = val.replace(
new RegExp('(' + keyword + ')', 'gi'),
`<font color="#4068d4">$1</font>`
)
(3)不想子表达式被引用,可以使用非捕获正则(?:regex)这样就可以避免浪费内存。
let str = 'scq000'
str.replace(/(scq00)(?:0)/, '$1,$2') ---> scq00,$2
由于使用了非捕获正则,所以第二个引用没有值,这里直接替换为$2
(4) ?: 举例说明非捕获组
let reg = /abc(de|fg)/g
let str = 'abcde12abcfg'
console.log(...str.matchAll(reg)) --->['abcde', 'de'] ['abcfg', 'fg']
reg = /abc(?:de|fg)/g
console.log(...str.matchAll(reg)) --->['abcde'] ['abcfg']