1. 程式人生 > >字串搜尋匹配之 test&search&indexOf

字串搜尋匹配之 test&search&indexOf

這裡要討論的是字串搜尋匹配時常用到的API: test search indexOf

  1. search
    該方法返回的是第一次匹配得到的結果,如果匹配到,返回第一次匹配得到的位置。如果沒有匹配到,返回-1。
var a = 'foofoo'
var regexp1 = /foo/
var regexp2 = /foo/g
var s1 = a.search(regexp1)  //返回0
var s1 = a.search(regexp1) //依然返回0 ,因此每次都是從頭開始匹配
var s2  = a.search(regexp2) //依然返回0, 因此正則表示式無論是否有全域性標誌都是隻返回第一次匹配的位置,且每次都從頭開始搜尋
var s3 = a.search('foo') //返回0, 這裡先將'foo'字串通過new RegExp()構造出正則物件,然後再進行search操作

以上程式碼中s3的獲取相當於進行了以下步驟:

var regexp3 = new RegExp('foo') //regexp3的值為:/foo/
var s3 = a.search(regexp3)

因此:對於search方法來說,每次都從字串的第0位開始搜尋並返回第一次匹配得到的位置,如果存在,則返回該位置,如果不存在,則返回-1。搜尋條件可以是正則表示式也可以是字串,如果是字串的話每次都是先用new RegExp()隱式的轉化成正則表示式,然後再進行匹配。

  1. test
    該方法的搜尋條件必須是正則表示式,如果存在,則返回true,如果不存在,則返回false。如果正則表示式是全域性搜尋的(有/g),每次匹配結束後
    lastIndex
    的值都會發生變化,最開始是0,一次匹配完成後就變成下一輪匹配的起始地址。
var s4 = regexp1.test(a) // 返回true
var s4 = regexp1.test(a) // 依然返回true, 因為regexp1沒有設定是全域性搜尋的
var s5 = regexp2.test(a) //返回true, 第一次匹配到結果,lastIndex變成3
var s5 = regexp2.test(a) //返回true,第二次匹配得到結果,lastIndex變成6
var s5 = regexp2.test(a)//返回false, 因為第三次匹配是從index=6開始匹配的,因此已經匹配不到了

因此:對於test方法來說,搜尋條件只能是正則表示式,返回的結果只可能是true或者false, 如果是全域性匹配,那麼每次匹配完成後,lastIndex都會變成下次匹配的起始位置。因此在使用test方法時,不熟悉的使用者可能會覺得明明存在匹配結果,但還是返回false,就是因為設定了全域性匹配,且已經進行了不止一次匹配。

  1. indexOf
    該方法的搜尋條件必須是字串,如果匹配到結果,返回第一次匹配的位置,如果沒有匹配到結果,則返回-1。且indexOf方法是可以設定從什麼位置開始搜尋的:str.indexOf(searchValue[, fromIndex]),預設從0開始搜尋。
var s6 = a.indexOf('foo')//返回的是0
var s7 = a.indexOf('foo', 6)//因為6>=a.length, 所以返回的是-1
var s8 = a.indexOf('foo', -1) //因為-1<0, 所以返回的是0

如果搜尋條件是空字串,那麼:

var s8 = a.indexOf('', -1) //因為搜尋條件是空字串且-1<0,所以返回0
var s9 = a.indexOf('', 2) //因為搜尋條件是空字串且0<=2<=a.length, 所以返回的即是該formIndex
var s10 = a.indexOf('', 7)//因為搜尋條件是空字串且7>a.length, 所以返回的即是a.length

注意:當字串作為search和indexOf方法的搜尋條件時,是區分大小寫的。