(?=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後面全部位置都將被匹配
相關文章
相關標籤/搜索