1. 程式人生 > >正則表示式_斷言(lookahead/lookbehind)

正則表示式_斷言(lookahead/lookbehind)

概念

  1. 正則表示式中的Where條件
    適用於更新regex表示式選中結果的部分內容
    實際上匹配字串,但隨後放棄匹配,只返回結果
  2. 例如 'as"df",sdf".sdfa">'.match(/"(?![>|\s|,|.])/)
    表示後面沒有字元 大於號(>),空格符( ),逗號(,),句號(.)的首個雙引號(“),最後匹配的結果只有雙引號(“)

    javascript測試,只返回了s字元後面的 "
    [""", index: 2, input: "as"df",sdf".sdfa">", groups: undefined]
    

分類

按照方向劃分有先行和後行兩種,按照是否匹配有肯定和否定兩種,組合起來就有四種斷言。
先行斷言相當於在當前位置右側附加一個條件,而後行斷言相當於在當前位置左側附加一個條件。

1. (?=Expression) 先行肯定斷言,表示所在位置右側能夠匹配Expression, 結果不包含Expression
2. (?!Expression) 先行否定斷言,表示所在位置右側不能匹配Expression, 結果不包含Expression
3. (?<=Expression) 後行肯定斷言,表示所在位置左側能夠匹配Expression, 結果不包含Expression
4. (?<!Expression) 後行否定斷言,表示所在位置左側不能匹配Expression, 結果不包含Expression

例項:Javascript測試

  1. "http://192.168.1.250:9595/".match("(?<=://)[a-zA-Z\.0-9-_]+(?=[:,\/])")

    含義:獲取IP地址, 匹配左側以 ‘://’ 開始,右側以 ‘:’ ‘,’ ‘\’ ‘/’ 之一的字元結束
    ", index: 7, input: "http://192.168.1.250:9595/", groups: undefined]
  2. "Add_New_Equipment_Item_Des2".match("(?<=Add_New)_(?=.*?Des2)")
    含義:獲取Add_New後面的首個下劃線符號
    ["_", index: 7, input: "Add_New_Equipment_Item_Des2", groups: undefined]
    3.'as"df",sd"f".sdfa">'.match(/"(?![>|\s|,|.])/g)

    含義:後面沒有字元 大於號(>),空格符( ),逗號(,),句號(.)的所有雙引號(“)
    /後面的 g表示global, 返回所有匹配的結果
    [""", """] //s與d後面的

注意

  1. Visual Studio 2017支援後行斷言, 但是Visual Studio Code不支援!github issue中說明vscode的正則過濾依賴於javascript,
    但javascript支援..可能程式的側重點不在單一的處理文字
  2. JavaScript Regex
  3. Regex Lookahead
  4. Regex Online Plat