Cocoa框架中的NSPredicate用于查詢馍忽,原理和用法都類似于SQL中的where逗宁,作用相當(dāng)于數(shù)據(jù)庫的過濾取
初始化的方式:
- NSPredicate(format:"")
用法
1.檢索值是否存在一個范圍區(qū)間里
var number2 = 0
var numberPre2 = NSPredicate(format: "SELF BETWEEN{1,5}")
var bool2 = numberPre2.evaluateWithObject(number2)
打印結(jié)果
當(dāng)number2 = 0 打忧亢狻:bool2 為false
當(dāng)number2 = 1 打佣伺琛:bool2 為true
2.檢索數(shù)組元素中是否包含給定字符串
var number2 = "dd"
var numberPre2 = NSPredicate(format: "SELF IN {'dd','bb'}")
var bool2 = numberPre2.evaluateWithObject(number2)
其中出現(xiàn)的關(guān)鍵字
(BETWEEN闪幽、IN)稱為范圍運(yùn)算符
SELF表示的是字符串本身料皇,在本例代碼中相當(dāng)于變量number2
當(dāng)然以數(shù)組的形式初始化NSPredicate也是可以的
var sets = ["dd","ss"]
var numberPre2 = NSPredicate(format: "SELF IN %@",sets)
3.字符串操作相關(guān)
1>判斷字符串中是否包含另一個字符串CONTAINS
var str3 = "dd"
var pre3 = NSPredicate(format: "SELF CONTAINS[cd] %@", str3)
var bool3 = pre3.evaluateWithObject("dsadd")
打印結(jié)果
當(dāng)str3="da" 打游剿伞:bool3=false
當(dāng)str3="dd" 打郁さ怼:bool3=true
2>判斷是否以某個字符串開頭BEGINSWITH
var str3 = "dd"
var pre3 = NSPredicate(format: "SELF BEGINSWITH[cd] %@", str3)
var bool3 = pre3.evaluateWithObject("ddacd")
打印結(jié)果
當(dāng)str3="da" 打印:bool3=false
當(dāng)str3="dd" 打佣痉怠:bool3=true
3>判斷是否以某個字符串結(jié)尾ENDSWITH
var str3 = "dd"
var pre3 = NSPredicate(format: "SELF ENDSWITH[cd] %@", str3)
var bool3 = pre3.evaluateWithObject("dcadd")
打印結(jié)果
當(dāng)str3="da" 打幼饽弧:bool3=false
當(dāng)str3="dd" 打印:bool3=true
注:
[c]不區(qū)分大小寫
[d]不區(qū)分發(fā)音符號即沒有重印符號
[cd]表示即不區(qū)分大小寫拧簸,也不區(qū)分發(fā)音符號
4.模糊查詢LINK通配符
5.正則表達(dá)式MATCHES
//匹配純數(shù)字
var number = "^[0-9]+$"
var numberPre = NSPredicate(format: "SELF MATCHES %@", number)
var boo3 = numberPre.evaluateWithObject("13140000000")
打印結(jié)果為 true
6.基本操作符運(yùn)算
let predicate = NSPredicate(format: "(SELF > 20) AND (SELF < 30)")
let boo7 = predicate.evaluateWithObject(num)
print(boo7)
打印結(jié)果
當(dāng)num = 20 打泳⑿鳌:false
當(dāng)num = 21 打印:true
實(shí)際應(yīng)用
1.檢索一個數(shù)組中所有包含此字符串的元素盆赤,并返回一個結(jié)果的數(shù)組
let arr4 = ["beijing" , "shanghai" , "guangzhou" , "wuhan"] asNSMutableArray
let str4 = "ang"
let pre4 = NSPredicate(format: "SELF CONtAINS %@", str4)
arr4.filterUsingPredicate(pre4)
打印arr4 結(jié)果為
["shanghai","guangzhou"]
2.判斷字符串首字符是否為字母
let regex1 = "[A-Za-z]+"
let pre5 = NSPredicate(format: "SELF MATCHES %@" , regex1)
let bool5 = pre5.evaluateWithObject("2")
3.字符串替換
//方法調(diào)用需要做異常處理
do{
let pattern = "(encoding=\")[^\"]+(\")"
let regex = try NSRegularExpression(pattern:
pattern , options:NSRegularExpressionOptions.CaseInsensitive)
let sample = "<xml encoding=\"abc\"></xml><xml
encoding=\"def\"></xml><xml encoding=\"ttt\"></xml>"
print(sample)
let result = regex.stringByReplacingMatchesInString(sample, options: NSMatchingOptions.ReportProgress, range: NSMakeRange(0, sample.characters.count), withTemplate: "$1utf-8$2")
print(result)
}catch{
print(error)
}
打印結(jié)果為
<xml encoding="abc"></xml><xml encoding="def"></xml><xml encoding="ttt"></xml>
<xml encoding="utf-8"></xml><xml encoding="utf-8"></xml><xml encoding="utf-8"></xml>
4.提取字符串
//組裝一個字符串贾富,需要把里面的網(wǎng)址解析出來
//方法調(diào)用需要做異常處理
do{
let urlString = "<meta/><link/><title>1Q84BOOK1</title></head><body>"
let pattern = "(?<=title\\>).*(?=</title)"
let regex = try NSRegularExpression(pattern: pattern , options: NSRegularExpressionOptions.CaseInsensitive)
let firstMatch = regex.firstMatchInString(urlString, options: NSMatchingOptions.ReportProgress, range: NSMakeRange(0, urlString.characters.count))
if firstMatch != nil {
let resultRange = firstMatch?.rangeAtIndex(0)
let result = (urlString as NSString).substringWithRange(resultRange!)
print(result)
}
}catch{
print(error)
}
打印結(jié)果
"1Q84BOOK1"