問(wèn)題:如何判斷一個(gè)字符串兒是否包含另一個(gè)字符串兒沿腰?
??其實(shí)脆诉,字符串兒String里面本身就包含一個(gè)contains()方法,它可以在一定程度上判斷一個(gè)字符串兒里面是否包含另一個(gè)字符串兒芭商。但是哑了,它比較傻舱馅,所能做的工作有限缰泡,比如說(shuō):
"Hello, July".contains("July") // 其返回值為true
"Hello, July".contains("july") // 其返回值應(yīng)該為true,但實(shí)際卻返回false
??contains()方法是嚴(yán)格區(qū)分大小寫(xiě)的代嗤,而這種嚴(yán)格顯然是與我們的要求不符棘钞。對(duì)于我們的題目來(lái)說(shuō),不管它是大寫(xiě)還是小寫(xiě)干毅,只要是包含該字符串兒宜猜,它就符合題目的要求。所以硝逢,我們需要另外想辦法對(duì)這種情況進(jìn)行處理姨拥。為此,可以考慮給String寫(xiě)一個(gè)擴(kuò)展:
extension String {
// 判斷一個(gè)字符串兒是否包含另一個(gè)字符串兒渠鸽,并且不用區(qū)分大小寫(xiě)
func fuzzyContains(_ string: String) -> Bool {
return self.uppercased().range(of: string.uppercased()) != nil
}
}
??我來(lái)解釋一下上面的代碼叫乌。首先,self.uppercased()和string.uppercased()分別將兩個(gè)字符串兒轉(zhuǎn)換成大寫(xiě)字符徽缚。以上面的”Hello憨奸,July”和“July”或者“july”為例,self.uppercased()會(huì)將”Hello凿试,July”中所有的字符全部轉(zhuǎn)換成大寫(xiě)字符排宰,而string.uppercased()則會(huì)將fuzzyContains(_ : )方法中的參數(shù),也就是“July”或者“july”中所有的字符全部轉(zhuǎn)換成大寫(xiě)字符那婉。之所以要做這種轉(zhuǎn)換板甘,就是為了解決上面contains()方法不能正確處理大小寫(xiě)的情況。其次详炬,range(of: )虾啦,這個(gè)方法就厲害了,它主要是返回一個(gè)字符串兒在另一個(gè)字符串兒中的位置痕寓,其結(jié)果為可選類(lèi)型傲醉。如果我們調(diào)用range(of: ),所得到的結(jié)果為nil呻率,那就說(shuō)明子字符串兒不包含在我們檢查的字符串兒中硬毕。如果相反,那就說(shuō)明字字符串兒包含在待檢查的字符串兒中:
??上面的方法已經(jīng)可以解決我們的問(wèn)題了礼仗,但是不夠簡(jiǎn)潔吐咳。還有一種方法逻悠,它可以將轉(zhuǎn)換字符大、小寫(xiě)和判斷是否包含子字符串兒合并到一起:
extension String {
func fuzzy1Contains(_ string: String) -> Bool {
return range(of: string, options: .caseInsensitive) != nil
}
}
"Hello, July".fuzzy1Contains("July") // 其返回值為true
"Hello, July".fuzzy1Contains("july") // 其返回值應(yīng)該為true韭脊,實(shí)際返回結(jié)果也為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") // 其返回值應(yīng)該為true童谒,實(shí)際返回結(jié)果也為true
??也就是說(shuō),不必顯式的進(jìn)行字符串兒大沪羔、小寫(xiě)的轉(zhuǎn)換饥伊,在使用range(of: )這個(gè)方法時(shí),多傳遞一個(gè)參數(shù)caseInsensitive蔫饰。它的作用就是告訴編譯器琅豆,不用嚴(yán)格區(qū)分字符大小寫(xiě)。