最近研究了正則的前後預查,感覺好玩就分享一下,文章最後有意外的驚喜哦。
前置約束和後之約束都屬於只匹配不捕獲(非捕獲族)。
前置約束用於判斷所匹配的格式是否在另一個確定的格式之後,反知,後之約束用於判斷所匹配的格式是否在另一個格式之前。
符號 | 描述 |
---|---|
?= | 前置約束-存在 |
?! | 前置約束-排除 |
?<= | 後置約束-存在 |
?<! | 後置約束-排除 |
1 、前置約束 ?=(存在)
比如 我們先想匹配red字串,但是希望後面跟的是shiny的字串。我們應該這樣寫 /(red)(?=shiny)/
/(red)(?=\sshiny)/=>'red shiny red black'
解釋一下 /(red)(?=\sshiny)/ 為什麼是\sshiny,因為red和shiny之間有一個空格所以加了一個\s 是空格匹配
2、前置約束?!(排除)
比如我們想匹配red字串,但是後面不跟black字串,那麼就應該這樣寫/(red)(?!\sblack)/
/(red)(?!\sblack)/=>'red shiny red black'
3、後置約束?<=(存在)
比如我們現在想匹配red字串,但是它的前面必須是shiny字串,那麼我們就應該這麼寫/(?<=\shiny\s)(red)/
/(?<=\shiny\s)(red)/=>'red shiny red black'
4、後置約束?<!(排除)
比如我們現想匹配red字串,但是它的前面不能是black字串,那麼我們用該這樣寫/(?<=!black\s)red/
/(?<!\black\s)(red)/=>'red shiny red black red'
上面的示例是不是很簡單,但是告訴大家一個很不好訊息尤其是移動端開發者,有些瀏覽器不支援這種寫法,我是在工作中遇見的,還有一個不得不吐槽的問題就是ios的safari不止"-"這個字元寫正則的時候大夥們注意一下