正则匹配相关内容

148 阅读2分钟

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']