RegExp 断言 (三)

·  阅读 150
RegExp 断言  (三)

前言

「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战」。

本节学习总结正则表达式-其他断言

前面一节有边界类断言

断言

  1. (?=p) 正向先行断言

  2. (?!p) 负向先行断言

  3. (?<=p) 正向后行断言

  4. (?<!p) 负向后行断言

正向负向:正向表示匹配括号中的表达式;负向表示不匹配。

先行后行:正则表达式引擎在执行字符串和表达式匹配时,会从头到尾扫描。

先行是指:当扫描指针位于某处时,引擎会尝试匹配指针还未扫过的字符,先于指针到达该字符 引擎比匹配指针快

后行:引擎会尝试匹配指针已扫过的字符,后于指针到达该字符引擎比匹配指针慢

(?=p) 正向先行断言

(?=p) 在p的前面加入


let string = '学不完的Font-End.卷它'

console.log(string.replace(/(?=End)/g, '☀️'))

// 学不完的Font-☀️End.卷它

复制代码

要匹配 regular中的re 而不是 expression中的re;

re(?=gular) 限定了re右边的位置,这个位置之后是gular,但并不消耗gular这些字符

let string = 'a regular expression'

console.log(string.match(/(re(?=g))/g)) //[ 're' ]
console.log(string.match(/(re(?=gular))/g)) //[ 're' ]
复制代码

(?!p) 正向后行断言

(?!p) 在(?=p)的匹配到的位置以外的地方 负向先行断言


let string = '学不完的Font-End.卷它'

console.log(string.replace(/(?!End)/g, '☀'))

// ☀️学☀️不☀️完☀️的☀️F☀️o☀️n☀️t☀️-E☀️n☀️d☀️.☀️卷☀️它☀️
复制代码

匹配re后面不为g的re

let string = 'regex represents regular expression'

console.log(string.match(/re(?!g)/g))

// [ 're', 're', 're' ]
复制代码

(?<=p) 负向先行断言

(?<=p) 该位置之前是p

let string = '学不完的Font-End.卷它'

console.log(string.replace(/(?<=End)/g, '☀️'))

// 学不完的Font-End☀️.卷它
复制代码

单词内部的re

let string = 'regex represents regular expression'

console.log(string4.match(/(?<=\w)re/g))

// [ 're', 're' ]    
复制代码

(?<!p) 负向后行断言

(?<=p)以外的地方

let string = '学不完的Font-End.卷它'

console.log(string2.replace(/(?<!End)/g, '☀️'))

// ☀️学☀️不☀️完☀️的☀️F☀️o☀️n☀️t☀️-☀️E☀️n☀️d.☀️卷☀️它☀️
复制代码

单词开头的re

let string = 'regex represents regular expression'

console.log(string.match(/(?<!\w)re/g))

// [ 're', 're', 're' ]  
复制代码

结语

反正我是眼睛会了,手不会。所以看了还得练!

参考

菜鸟教程

MDN断言

就因为这三个知识点,我彻底学废了”正则表达式"

分类:
前端
标签:
分类:
前端
标签: