(?=a)与(?!a)表明什么意思

正则表达式的先行断言及后行断言

一共分为四种正则表达式

  • (?=a) 零宽正向先行断言
  • (?!a)零宽负向先行断言
  • (?<=a)零宽正向后行断言
  • (?<!a)零宽负向后行断言

专业术语听起来确实有点云里雾里,通俗的讲就是匹配某个位置,位置指某个字符的左边或右边,零宽指的是不替换字符左右的字符,而是插入该位置。spa

(?=a) 零宽正向先行断言

该正则匹配某字符前面的位置。指针

let reg = /(?=o)/g
let str = 'hello world'
let s = str.replace(reg,'A')
console.log(s)    //输出hellAo wAorld
复制代码

通过上面的代码能够看到,A匹配到了o前面的位置code

let reg = /l(?=o)/g
let str = 'hello world'
let s = str.replace(reg,'A')
console.log(s)     //输出helAo world
复制代码

该正则匹配后面紧跟o的l字符,只有第二个l知足该条件,因此被替换console

(?!a)零宽负向先行断言

与上面的(?!a)相反,这个表达式匹配后面没有a字符的位置class

let reg = /(?!l)/g
let str = 'hello'
let s = str.replace(reg,'A')
console.log(s)    //输出AhAellAoA
复制代码

该正则匹配后面没有字符l的位置,所以除了两个l字母前,均插入了A字符总结

let reg = /l(?!o)/g
let str = 'hello'
let s = str.replace(reg,'A')
console.log(s)    //输出heAlo
复制代码

该正则表示匹配后面无o字符的l字符,由于只有第一个l后面没有o,所以被替换移动

(?<=a)零宽正向后行断言

与(?=a)位置相反,匹配a字符后面的位置di

let reg = /(?<=l)/g
let str = 'hello'
let s = str.replace(reg,'A')
console.log(s)    //输出helAlAo
复制代码

该正则匹配了全部l后面的位置,在该位置插入A字符copy

let reg = /(?<=l)o/g
let str = 'hello'     
let s = str.replace(reg,'A')
console.log(s)    //输出hellA
复制代码

该正则匹配前面为l的o字符

(?<!a)零宽负向后行断言

与(?!a)位置相反,匹配前面没有a字符的位置

let reg = /(?<!l)/g
let str = 'hello'
let s = str.replace(reg,'A')
console.log(s)    //输出AhAeAlloA
复制代码

该正则匹配全部前面没有l的位置

let reg = /(?<!e)l/g
let str = 'hello'
let s = str.replace(reg,'A')
console.log(s)    //输出helAo
复制代码

只有第二个l前面没有e所以,第二个被替换

总结

  1. (?=a) 零宽正向先行断言 能够理解为一个指针从第一个字符前面开始,由前向后移动,碰到a字符时在a字符前面停下,表明该位置
  2. (?<=a)零宽正向后行断言 能够理解为一个指针从最后一个字符后面开始,由后向前移动,碰到a字符时在a字符后面停下,表明该位置
  3. (?!a)零宽负向先行断言 与(?=a)相反,除去a前面的全部位置都将被匹配
  4. (?<!a)零宽负向后行断言 与(?<=a)相反,除去a后面全部位置都将被匹配
相关文章
相关标签/搜索