1. 程式人生 > >判斷一個字串中是否包含另一個字串

判斷一個字串中是否包含另一個字串

問題:如何判斷一個字串兒是否包含另一個字串兒?

  其實,字串兒String裡面本身就包含一個contains()方法,它可以在一定程度上判斷一個字串兒裡面是否包含另一個字串兒。但是,它比較傻,所能做的工作有限,比如說:

"Hello, July".contains("July")  // 其返回值為true
"Hello, July".contains("july")  // 其返回值應該為true,但實際卻返回false

  contains()方法是嚴格區分大小寫的,而這種嚴格顯然是與我們的要求不符。對於我們的題目來說,不管它是大寫還是小寫,只要是包含該字串兒,它就符合題目的要求。所以,我們需要另外想辦法對這種情況進行處理。為此,可以考慮給String寫一個擴充套件:

extension String {
    
    // 判斷一個字串兒是否包含另一個字串兒,並且不用區分大小寫
    func fuzzyContains(_ string: String) -> Bool {
        return self.uppercased().range(of: string.uppercased()) != nil
    }
}

  我來解釋一下上面的程式碼。首先,self.uppercased()和string.uppercased()分別將兩個字串兒轉換成大寫字元。以上面的”Hello,July”和“July”或者“july”為例,self.uppercased()會將”Hello,July”中所有的字元全部轉換成大寫字元,而string.uppercased()則會將fuzzyContains(_ : )方法中的引數,也就是“July”或者“july”中所有的字元全部轉換成大寫字元。之所以要做這種轉換,就是為了解決上面contains()方法不能正確處理大小寫的情況。其次,range(of: ),這個方法就厲害了,它主要是返回一個字串兒在另一個字串兒中的位置,其結果為可選型別。如果我們呼叫range(of: ),所得到的結果為nil,那就說明子字串兒不包含在我們檢查的字串兒中。如果相反,那就說明字字串兒包含在待檢查的字串兒中:

判斷一個字串兒是否包含另一個字串兒.png
判斷一個字串兒是否包含另一個字串兒.png

  上面的方法已經可以解決我們的問題了,但是不夠簡潔。還有一種方法,它可以將轉換字元大、小寫和判斷是否包含子字串兒合併到一起:

extension String {
    func fuzzy1Contains(_ string: String) -> Bool {
        return range(of: string, options: .caseInsensitive) != nil
    }
}

"Hello, July".fuzzy1Contains("July")  // 其返回值為true
"Hello, July".fuzzy1Contains("july")  // 其返回值應該為true,實際返回結果也為true

extension String {
    func fuzzy2Contains(_ string: String) -> Bool {
        return range(of: string, options: .caseInsensitive, range: nil, locale: nil) != nil
    }
}

"Hello, July".fuzzy2Contains("July")  // 其返回值為true
"Hello, July".fuzzy2Contains("july")  // 其返回值應該為true,實際返回結果也為true

  也就是說,不必顯式的進行字串兒大、小寫的轉換,在使用range(of: )這個方法時,多傳遞一個引數caseInsensitive。它的作用就是告訴編譯器,不用嚴格區分字元大小寫。