js正則test匹配的踩坑及解決
引言
本瓜相信你一定經(jīng)常用以下這種最最簡(jiǎn)單的正則來(lái)判斷字符串中是否存在某個(gè)子字符(別說(shuō)了,我就是)??
const pattern = /ab/g
pattern.test("abcd") // true
這樣去匹配,有什么問(wèn)題嗎?
不急,現(xiàn)在來(lái)讓你猜一下,以下代碼的輸出?
const pattern = /ab/g
console.log(pattern.test("abcd"))
console.log(pattern.test("abcd"))
console.log(pattern.test("abcd"))
“不就是三個(gè) true 嗎?!”
在控制臺(tái)上打印試試?驚不驚喜、意不意外?
為什么是 true 、false 、true ?
原來(lái)這里,這里有個(gè)小坑需要注意下,用 test() 連續(xù)做匹配的時(shí)候,會(huì)出錯(cuò),是因?yàn)橐粋€(gè)我們將要認(rèn)識(shí)的 —— 正則類(lèi)型 lastIndex 屬性!
lastIndex 屬性用于規(guī)定下次匹配的起始位置。
每次當(dāng)我們用正則 RegExp.exec() 和 RegExp.test() 進(jìn)行匹配的時(shí)候,如果返回為 true,lastIndex 屬性的值會(huì)發(fā)生變化,會(huì)變成正確匹配的子字符串的最后位置,并將此位置作為下次檢索的起始點(diǎn)。如果返回為 false,lastIndex 重置為 0 ;
所以,我們這樣打印試試就知道了:
const pattern = /ab/g
console.log(pattern.test("abcd")) // true
console.log(pattern.lastIndex) // 2
console.log(pattern.test("abcd")) // false
console.log(pattern.lastIndex) // 0
console.log(pattern.test("abcd")) // true
console.log(pattern.lastIndex) // 2
當(dāng)我們第一次調(diào)用 pattern.test("abcd") ,pattern.lastIndex 為 2, 即字母 b 的位置,當(dāng)再次調(diào)用 pattern.test("abcd") 則會(huì)從 b 的位置往后搜索,搜不到 ab 了,返回 false ,同時(shí) lastIndex 重置為 0 ,然后第三次調(diào)用 pattern.test("abcd") 又能正確返回 true 了,lastIndex 也變成了 2。
不知道這個(gè)坑,你踩到過(guò)沒(méi)?
怎么解決呢?
方法一:手動(dòng)清理 lastIndex
const pattern = /ab/g
console.log(pattern.test("abcd")) // true
pattern.lastIndex = 0
console.log(pattern.test("abcd")) // true
不過(guò),這樣手動(dòng)清理很麻煩,顯得很笨,所以建議用方法二。
方法二:用 match 來(lái)匹配
const pattern = /ab/g
console.log("abcd".match(pattern)) // ['ab']
console.log("abcdab".match(pattern)) // ['ab', 'ab']
console.log("123".match(pattern)) // null
match 是匹配的更優(yōu)解,不用手動(dòng)清理,存在則悉數(shù)返回成數(shù)組,不存在,返回 null
以上就是正則test匹配的踩坑及解決的詳細(xì)內(nèi)容,更多關(guān)于正則test匹配坑的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
用js判斷頁(yè)面刷新或關(guān)閉的方法(onbeforeunload與onunload事件)
Onunload,onbeforeunload都是在刷新或關(guān)閉時(shí)調(diào)用,可以在<script>腳本中通過(guò)window.onunload來(lái)指定或者在<body>里指定2012-06-06
layer ui插件顯示tips時(shí),修改字體顏色的實(shí)現(xiàn)方法
今天小編就為大家分享一篇layer ui插件顯示tips時(shí),修改字體顏色的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-09-09
利用JavaScript腳本實(shí)現(xiàn)滾屏效果的方法
這篇文章主要介紹了利用JavaScript腳本實(shí)現(xiàn)滾屏效果的方法,即一個(gè)公告欄顯示般的效果,需要的朋友可以參考下2015-07-07
整理Javascript數(shù)組學(xué)習(xí)筆記
整理Javascript數(shù)組學(xué)習(xí)筆記,之前一系列的文章是跟我學(xué)習(xí)Javascript,本文就是進(jìn)一步學(xué)習(xí)javascript數(shù)組,希望大家繼續(xù)關(guān)注2015-11-11
JavaScript編寫(xiě)Chrome擴(kuò)展實(shí)現(xiàn)與瀏覽器的交互及時(shí)間通知
得益于API,我們可以用JavaScript編寫(xiě)Chrome擴(kuò)展實(shí)現(xiàn)與瀏覽器的交互及時(shí)間通知。值得一提的是現(xiàn)在Chrome擁有后臺(tái)進(jìn)程可以使通知在前臺(tái)瀏覽器關(guān)閉的情況下依然能夠生效.2016-05-05
JavaScript中的null和undefined區(qū)別介紹
這篇文章主要介紹了JavaScript中的null和undefined區(qū)別介紹,JavaScript中存在2個(gè)代表信息不存在的特殊值:null和undefined,本文主要講解它們的區(qū)別,需要的朋友可以參考下2015-01-01
layer頁(yè)面跳轉(zhuǎn),獲取html子節(jié)點(diǎn)元素的值方法
今天小編就為大家分享一篇layer頁(yè)面跳轉(zhuǎn),獲取html子節(jié)點(diǎn)元素的值方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-09-09
通過(guò)實(shí)例解析js簡(jiǎn)易模塊加載器
這篇文章主要介紹了通過(guò)實(shí)例解析js簡(jiǎn)易模塊加載器,隨著前端工程越來(lái)越復(fù)雜,代碼越來(lái)越多,模塊化成了必不可免的趨勢(shì)。,需要的朋友可以參考下2019-06-06

