2019年11月23日 星期六

【.js】正規表達式一次比對多個字元的字串|javascript萬用字元regEX

正規表達式(regEx / regular Expression)|javascript

上一篇:【.js】正規表達式(regEx / regular Expression)|javascript萬用字元講了常用的萬用字元跟貪婪模式,這篇要講另一個有趣的環視結構

  function alert_result() {
     var str = ;
     var regEx = / /g;
  alert(str.match(regEx));
  }

環視結構

簡單的舉一個例子我們在"121314151617"裡面找所有後面有接456的1,那麼你一定會想用/1[456]/g來找,但是在輸出的時候他也會是兩位數,不是我們要的1,這時候我們就用/(?=1[456])1/g來找看看,很明顯的就會發現確實只會輸出1,1,1三個1呢

環視結構排除

簡單來說就是一次一個字元同時檢查看後面連結的字串。
用一個簡單的例子來說,我要在"<div><div>123</div></div>中找到裡面的div"

所以我就用"/<div>.*<\/div>/g"找一次,然後發現,我找到外層的div了。
所以我接著用非貪婪模式找"/<div>.*?<\/div>/g",然後發現,找到"<div><div>123</div>"
這時候就會開始想,要<div>最為開頭,裡面又不能有<div>,那就要一次判斷五個字元了,這時候就要用環狀排除!

用 /<div>(?!<div>).*?<\/div>/g 查找

一樣開頭是<div>結尾是<\/div>,中間的是.*?非貪婪模式任意數量的任意字元,但是不能有<div>連在一起。

目標 <div><div>123</div></div> /<div>.*?<\/div>/g 這次跳快一點
步驟一 <div> /<div>/ 可以,繼續往下,但是優先跳過(?!<div>).*?
步驟二 <div>< /<div></ 可以,繼續往下
步驟三 <div><d /<div><\// 不行,往回加入優先跳過的(?!<div>).*?
步驟四 <div>< /<div(?!<div>).*?/ 不可以,因為.雖然可以是<,但是從這個字元開始後面是<div>,所以就只能放棄了
步驟五 用<篩掉d、i、v、>,從第二個<div>開始重跑 /<div>/ 可以,繼續往下,但是優先跳過(?!<div>).*?
步驟六 <div>1 /<div></ 不可以,往前放回(?!<div>).*?
步驟七 <div>1 /<div>(?!<div>)./
(我們一次看一個字元)
可以,繼續往下
步驟八 <div>12 /<div>(?!<div>).</ 不可以,往回再放一個(?!<div>). ,以此類推步驟七八直到找到<div>123</div>

一些找html的例子

img <img class="test" src="/img/logo.gif" title="test" /> /<img\b.*?src="([^"]*)"[^>]*>/g
a <a id="test "class="test" href="/#" target='_blank' /> /<a>(?!<a>).*?<\/a>/g
<!-- --> <!-- 這是一段隱藏符號,甚至是有-這種符號--> /<!--(?!<--).*?-->/g
全部的標籤,留下純字 <div class='test'><a href="#"><span style='color:#fff'>test</span></a></div> /<[^>]*>/g

額外提供有趣又複雜的例子