正規表達式(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 |