前言
「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战」。
本节学习总结正则表达式-其他断言
前面一节有边界类断言
断言
-
(?=p) 正向先行断言
-
(?!p) 负向先行断言
-
(?<=p) 正向后行断言
-
(?<!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' ]
结语
反正我是眼睛会了,手不会。所以看了还得练!