有時候我們會有需求從一個字符串中截取其他的字符串,根據情況的不同,我們來分析幾種方法~~
一. 固定長度字符串中截取固定位置長度的字符串
// 這是比較簡單的一種情況:比如截取手機號的后4位
let phoneNum = "18515383061"
var suffixNum:String?
// 從倒數第四位開始截取,截取到最后
suffixNum = phoneNum.substringFromIndex(phoneNum.endIndex.advancedBy(-4))
// 從開頭截取到第三位,獲取手機號前3位
let prefixNum = phoneNum.substringToIndex(phoneNum.startIndex.advancedBy(3))
// 截取區間內字符串
suffixNum = phoneNum.substringWithRange(phoneNum.endIndex.advancedBy(-4)..<phoneNum.endIndex)
二. 不固定長度的字符串,但是有分隔符
//例如獲取日期中的年,月,日
// 分割符可以是任意的字符,一般為'/','_','空格',或者是特殊的字符.
let timeStr = "2013/10/26"
let timeArr = timeStr.componentsSeparatedByString("/")
print(timeArr)
三. 不固定長度的字符串,取特殊規則下的字符串
// 如下所示,我們想要截取第一個中括號里面的字符串
// 假設這個字符串是服務器返回的,長度不定,中括號的位置也不定,先后通過簡單的截取就比較困難了
// 這個時候就要用到**正則表達式**,相信大家知道,但如何在Swift中利用正則表達式來篩選值呢,我們來分析一下
// rangOfString本來是用來收索文中的字符串的,但是可以選擇模式.這里選擇(.RegularExpressionSearch)也就是正則的搜索
// 但是OC和Swift中都只有這一種收索方法,只有Search,沒有其他的,相比其他的語言(Python,PHP)弱太多了
// 單純匹配中括號里的字正則想必大家都會寫 "\\[.*\\]",但是有一個問題就是收索的內容是'[thing] jflsdfs [do]',這顯然不是我們想要的
// 這就要收到正則的貪婪模式了,默認它盡可能多的匹配符合要求的字符串,而我們想讓他滿足最精巧的那個,就需要加上一個?號,就是這個樣子"\\[.*?\\]",這樣搜索到的就是'[thing]'
// 你發現這還不是我們想要的,為什么要帶上'['和']'呢,但是沒辦法,這是你的檢索條件啊
// 但是什么也難不倒正則,正則當中有 零寬斷言,<零寬度正預測先行斷言(?=exp)> 斷言自身出現的位置的后面能匹配表達式exp,
// <零寬度正回顧后發斷言(?<=exp)>,它斷言自身出現的位置的前面能匹配表達式exp,最終我們的表達式是"(?<=\\[).*?(?=\\])"
let string = "I Want to Do some [thing] jflsdfs [do]"
if let result = string.rangeOfString("(?<=\\[).*?(?=\\])", options: .RegularExpressionSearch, range:string.startIndex..<string.endIndex, locale: nil) {
print(string.substringWithRange(result))
}
作者:SSBun
鏈接:http://www.jianshu.com/p/d6fcc9bcd8de
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。