摘要:的文檔說的很清楚,是正則表達(dá)式一個(gè)可讀可寫的整形屬性,表示下次正則匹配的起始索引。只有在正則本身使用全局匹配時(shí),該屬性才會(huì)被設(shè)置并且起作用。如果等于字符串的長度,且該正則表達(dá)式匹配空字符串,則該正則表達(dá)式匹配從開始的字符串。
故事的開始是這樣的:
需要做的就是為這個(gè)列表加上搜索功能。為了更簡單的說明問題,這個(gè)問題最后就相當(dāng)于對(duì)原始
name數(shù)組進(jìn)行一次匹配過濾,于是想當(dāng)然的有了類似下面的代碼:
var ori=["李同學(xué)1","李同學(xué)2","李同學(xué)3","劉同學(xué)"] var searchText="李" var reg = new RegExp(".*"+searchText+".*", "g") var newArr = ori.filter(function(value) { return reg.test(value) }) console.log(newArr) //[ "李同學(xué)1", "李同學(xué)3" ]
這里假設(shè)我們的搜索字符串為‘李’,預(yù)期過濾過后的新數(shù)組newArr應(yīng)該為["李同學(xué)1","李同學(xué)2","李同學(xué)3"],可打印出來的結(jié)果只有2個(gè),跳過了數(shù)組中的第二個(gè)元素。這里隱藏了什么問題?為了說清楚這個(gè)問題,要從正則表達(dá)式本身的一個(gè)屬性lastIndex說起。
regexp.lastIndexmdn的文檔說的很清楚,lastIndex是正則表達(dá)式一個(gè)可讀可寫的整形屬性,表示下次正則匹配的起始索引。只有在正則本身使用全局匹配 ‘g’ 時(shí),該屬性才會(huì)被設(shè)置并且起作用。且該屬性的設(shè)置遵循下面的規(guī)則:
如果 lastIndex 大于字符串的長度,則 regexp.test 和 regexp.exec 將會(huì)匹配失敗,然后 lastIndex 被設(shè)置為 0。
如果 lastIndex 等于字符串的長度,且該正則表達(dá)式匹配空字符串,則該正則表達(dá)式匹配從 lastIndex 開始的字符串。
如果 lastIndex 等于字符串的長度,且該正則表達(dá)式不匹配空字符串 ,則該正則表達(dá)式不匹配字符串,lastIndex 被重置為 0.。
否則,lastIndex 被設(shè)置為緊隨最近一次成功匹配的下一個(gè)位置。
規(guī)則看的很暈,其實(shí)自己試一下就知道了。回顧上面的問題,我們打印一下lastIndex屬性:
var ori=["李同學(xué)1","李同學(xué)2","李同學(xué)3","劉同學(xué)1"] var searchText="李" var reg = new RegExp(".*"+searchText+".*","g") var newArr = ori.filter(function(value) { console.log(reg.lastIndex) return reg.test(value) }) console.log(newArr) //執(zhí)行的結(jié)果為 0 4 0 4 [ "李同學(xué)1", "李同學(xué)3" ]
由上面打印的結(jié)果,問題出在哪了已經(jīng)很明顯了,對(duì)于數(shù)組中第二個(gè)元素的匹配,是從索引為4開始(索引的結(jié)果還與 .* 默認(rèn)的貪婪模式匹配有關(guān),這里不做贅述),這里當(dāng)然不匹配,符合上述第三個(gè)規(guī)則,知道了這一點(diǎn),我們就可以很靈活的改正這個(gè)問題:
var ori=["李同學(xué)1","李同學(xué)2","李同學(xué)3","劉同學(xué)1"] var searchText="李" //最直接的就是取消正則的全局匹配標(biāo)志 var reg = new RegExp(".*"+searchText+".*?") var newArr = ori.filter(function(value) { return reg.test(value) }) //把起始索引改回來 var reg = new RegExp(".*"+searchText+".*?","g") var newArr = ori.filter(function(value) { reg.lastIndex=0 return reg.test(value) }) //還可以忽略所有名稱的第一位進(jìn)行匹配 var reg = new RegExp(".*"+searchText+".*?","g") var newArr = ori.filter(function(value) { reg.lastIndex=1 return reg.test(value) })
最后一個(gè)細(xì)節(jié),在非全局匹配模式下,lastIndex屬性是不起作用的,即使設(shè)置這個(gè)屬性值,匹配也會(huì)從起始位置開始。
結(jié)語其實(shí)解決這個(gè)問題,最開始的時(shí)候并沒有直擊問題的核心,只知道test()方法是返回一個(gè)布爾值,對(duì)lastIndex屬性也沒有太多了解,也就沒法意識(shí)到這一層,但我還是去mdn看了一下test()的文檔,默認(rèn)看的中文版,很不幸中文版的翻譯里剛好少了正則全局標(biāo)志下使用test()這一節(jié),于是更堅(jiān)定此方法不就是返回個(gè)布爾值的論斷。結(jié)果多繞了幾彎,一怒之下就跑去補(bǔ)充了mdn關(guān)于test()方法的中文翻譯。
對(duì)于一個(gè)初級(jí)程序員的日常開發(fā)來說,很多時(shí)候遇到的‘意外’,都是相關(guān)內(nèi)容知道的不全面,這時(shí)候參考文檔一般都是可以發(fā)現(xiàn)問題。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/89813.html
摘要:等價(jià)于實(shí)例屬性正則對(duì)象的實(shí)例屬性分成兩類。返回一個(gè)布爾值,表示是否設(shè)置了修飾符。字符串對(duì)象的方法,返回第一個(gè)滿足條件的匹配結(jié)果在整個(gè)字符串中的位置。字符串對(duì)象的方法按照正則規(guī)則分割字符串,返回一個(gè)由分割后的各個(gè)部分組成的數(shù)組。 概述實(shí)例屬性實(shí)例方法RegExp.prototype.test()g RegExp.prototype.exec()g括號(hào)indexx input屬性字符串的實(shí)...
摘要:正則表達(dá)式如何創(chuàng)建正則表達(dá)式字面量創(chuàng)建通過構(gòu)造函數(shù)正則表達(dá)式實(shí)例屬性及方法三個(gè)修飾符屬性,只讀不可修改正則表達(dá)式是否添加了忽略大小寫的修飾符,返回一個(gè)布爾值正則表達(dá)式是否添加了全局匹配的修飾符,返回一個(gè)布爾值正則表達(dá)式是否添加了換行的修飾符 正則表達(dá)式 如何創(chuàng)建正則表達(dá)式 字面量創(chuàng)建var r = /a/; 通過構(gòu)造函數(shù)var r = new RegExp(a); 正則表達(dá)式實(shí)...
摘要:正則表達(dá)式基礎(chǔ)知識(shí)正則表達(dá)式是計(jì)算機(jī)科學(xué)的一個(gè)概念。正則表達(dá)式使用單個(gè)字符竄來描述匹配一系列符合某個(gè)句法規(guī)則的字符竄。正則表達(dá)式的文本字符竄。第二個(gè)參數(shù)是正則表達(dá)式分組內(nèi)容,沒有分組則沒有該參數(shù)。 正則表達(dá)式-基礎(chǔ)知識(shí)Review 正則表達(dá)式(Regular Expression)是計(jì)算機(jī)科學(xué)的一個(gè)概念。 正則表達(dá)式使用單個(gè)字符竄來描述、匹配一系列符合某個(gè)句法規(guī)則的字符竄。 在很多文本...
摘要:是否有標(biāo)志對(duì)返回值有很大影響。參數(shù)限制返回值中分割元素?cái)?shù)量方法返回一個(gè)由替換值替換一些或所有匹配的模式后的新字符串。 文章同步到github 正則在平時(shí)工作中用的非常多, 最開始接觸正則的時(shí)候感覺這個(gè)東東好難記啊,最近把正則的內(nèi)容整理了一下,寫成以下文章。 先給大家介紹一個(gè)在線解析正則的網(wǎng)站,來幫助我們理解正則,特別是復(fù)雜的正則表達(dá)式,非常好用 http://www.regexper....
摘要:對(duì)于對(duì)象,方法返回一個(gè)該正則表達(dá)式的字面量。顯示顯示正則表達(dá)式在的應(yīng)用一個(gè)在字符串中執(zhí)行查找匹配的方法,它返回一個(gè)數(shù)組或者在未匹配到時(shí)返回。 為什么要用正則表達(dá)式 簡單的說:我們與字符串接觸的頻率非常之高,正則表達(dá)式可以極大的提高復(fù)雜文本分析的效率,快速匹配出復(fù)雜的字符串。 創(chuàng)建一個(gè)正則表達(dá)式 直接量語法(字面量) var expression = /pattern/flags ;...
閱讀 668·2019-08-30 15:44
閱讀 1389·2019-08-30 11:02
閱讀 2996·2019-08-29 18:42
閱讀 3518·2019-08-29 16:16
閱讀 1727·2019-08-26 13:55
閱讀 1780·2019-08-26 13:45
閱讀 2393·2019-08-26 11:43
閱讀 3257·2019-08-26 10:32