OC正則表達式
- NSString 簡單的字符串查找、替換;
- NSRegularExpression 復雜的文本匹配、替換;
- NSPredicate 復雜文本、對象等數(shù)據(jù)檢索, 有點像一個支持正則的SQL語句.
NSString
NSString *str2 = @"jjjjUUUUU@baidu.com";
//以英文字母開頭
/*
options:
NSRegularExpressionSearch 適用于rangeOfString:…stringByReplacingOccurrencesOfString:……,replaceOccurrencesOfString:……方法;搜索字符串被視為一個icu兼容的正則表達式;如果設置了,除了NSCaseInsensitiveSearch和NSAnchoredSearch,其他選項都不能應用
NSAnchoredSearch 搜索被限制為源字符串的開始(或結(jié)束,如果NSBackwardsSearch)
NSCaseInsensitiveSearch 忽略大小寫
locale:
要執(zhí)行用戶級字符串搜索,指定locale:[NSLocale currentLocale],或者更好的方法是使用localizedStandardRangeOfString:或localizedStandardContainsString:。
*/
NSRange range1 = [str2 rangeOfString:@"[a-z]"
options:NSRegularExpressionSearch | NSAnchoredSearch | NSCaseInsensitiveSearch
range:NSMakeRange(0, str2.length)
locale:[NSLocale currentLocale]];
NSString *subString = [str2 substringWithRange:range1];
//文字替換
NSString *newString = [str2 stringByReplacingCharactersInRange:range1 withString:@"aaa"];
NSLog(@"截獲的字符%@",subString); //截獲的字符j
NSLog(@"替換后的字符%@",newString);//替換后的字符aaajjjUUUUU@baidu.com
NSRegularExpression
NSRegularExpression是一個用來表示和應用正則表達式的類。此類的實例是已編譯正則表達式模式和各種選項標志的不可變表示。
NSString *str = @"clc_cfzxyq@163.com wcowfjwogjwoiejfiow 12321@qq.com 298349845fwe ctftf iLoveiOS@qq.com";
NSString *pattern = @"\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";
/*
options:
NSRegularExpressionCaseInsensitive = 1 << 0, 匹配模式中與大小寫無關(guān)的字母
NSRegularExpressionAllowCommentsAndWhitespace = 1 << 1, 忽略模式中的空格和帶#前綴的注釋。
NSRegularExpressionIgnoreMetacharacters = 1 << 2, 將整個模式視為文字字符串。
NSRegularExpressionDotMatchesLineSeparators = 1 << 3, 允許的。匹配任何字符,包括行分隔符。
NSRegularExpressionAnchorsMatchLines = 1 << 4, 允許^和$匹配行開始和結(jié)束。
NSRegularExpressionUseUnixLineSeparators = 1 << 5, 只將\n作為行分隔符(否則,將使用所有標準行分隔符
NSRegularExpressionUseUnicodeWordBoundaries = 1 << 6 使用Unicode TR#29來指定單詞邊界(否則,將使用傳統(tǒng)的正則表達式單詞邊界)
*/
NSRegularExpression *regular = [[NSRegularExpression alloc] initWithPattern:pattern
options:(NSRegularExpressionCaseInsensitive)
error:nil];
//1.返回匹配的數(shù)組 數(shù)組中是NSTextCheckingResult類型
/*
options:
NSMatchingReportProgress = 1 << 0, 在長時間運行的匹配操作期間定期調(diào)用該塊。
NSMatchingReportCompletion = 1 << 1, 在完成任何匹配之后調(diào)用該塊一次
NSMatchingAnchored = 1 << 2, 將匹配限制在搜索范圍的開始處
NSMatchingWithTransparentBounds = 1 << 3, 允許匹配超出搜索范圍的范圍
NSMatchingWithoutAnchoringBounds = 1 << 4 阻止^和$自動匹配搜索范圍的開始和結(jié)束
*/
NSArray *arry = [regular matchesInString:str
options:0
range:NSMakeRange(0, str.length)
];
/*2.默認情況下,塊迭代器方法為每個匹配精確地調(diào)用塊一次,使用非nil結(jié)果和適當?shù)臉酥尽H缓?,客戶端可以通過將stop的內(nèi)容設置為YES來停止操作。如果指定了NSMatchingReportProgress選項,那么在長時間運行的匹配操作期間也將定期調(diào)用該塊,標志中將設置nil結(jié)果和NSMatchingProgress,此時客戶端可以通過將stop的內(nèi)容設置為YES再次停止操作。如果指定了NSMatchingReportCompletion選項,那么在匹配完成后,塊將被調(diào)用一次,在標記中設置nil結(jié)果和NSMatchingCompleted,以及來自NSMatchingHitEnd、NSMatchingRequiredEnd或NSMatchingInternalError之間的任何附加相關(guān)標記。NSMatchingReportProgress和NSMatchingReportCompletion對塊迭代器以外的方法沒有影響。
如果當前匹配操作到達搜索范圍的末端,則在傳遞給塊的標志中設置NSMatchingHitEnd。如果當前匹配取決于搜索范圍結(jié)束的位置,則在傳遞給塊的標志中設置NSMatchingRequiredEnd。NSMatchingInternalError是在沒有檢查整個搜索范圍的情況下,由于內(nèi)部錯誤(例如需要指數(shù)內(nèi)存分配的表達式)導致匹配失敗而傳遞給塊的標志中設置的。
nsmatchinglocked, NSMatchingWithTransparentBounds, NSMatchingWithoutAnchoringBounds可以應用于任何匹配或替換方法。如果指定了nsmatchinganchor,那么匹配將被限制在搜索范圍的開始部分。如果指定了NSMatchingWithTransparentBounds,那么匹配可以檢查超出搜索范圍界限的部分字符串,以達到諸如單詞邊界檢測、向前查找等目的。如果指定了NSMatchingWithoutAnchoringBounds, ^和$將不會自動匹配搜索范圍的開始和結(jié)束(但仍然會匹配整個字符串的開始和結(jié)束)。如果搜索范圍覆蓋了整個字符串,則nsmatchingwithtransparency bounds和NSMatchingWithoutAnchoringBounds將不起作用。
NSRegularExpression被設計成不可變的、線程安全的,這樣一個實例就可以同時用于匹配多個線程上的操作。但是,在匹配操作的過程中(無論是從另一個線程還是從迭代中使用的塊中),它所操作的字符串不應該發(fā)生變化。
*/
[regular enumerateMatchesInString:str
options:0
range:NSMakeRange(0, str.length)
usingBlock:^(NSTextCheckingResult * _Nullable result, NSMatchingFlags flags, BOOL * _Nonnull stop) {
}];
//3.匹配總數(shù)
NSInteger jj = [regular numberOfMatchesInString:str
options:0
range:NSMakeRange(0, str.length)];
//解析匹配的結(jié)果
NSMutableArray *muarry = [[NSMutableArray alloc] init];
if (arry.count>0) {
for (NSTextCheckingResult *result in arry) {
NSRange range = result.range;
[muarry addObject:[str substringWithRange:range]];
}
}
NSLog(@"%@",muarry);//"clc_cfzxyq@163.com","12321@qq.com","iLoveiOS@qq.com"
//匹配第一個數(shù)據(jù)
NSRange firstRange = [regular rangeOfFirstMatchInString:str
options:0
range:NSMakeRange(0, str.length)];
//替換(返回替換后的新字符串, 源字符串不變)
NSString *newStr = [regular stringByReplacingMatchesInString:str options:0 range:firstRange withTemplate:@"哈哈"];
NSLog(@"%@",newStr);//哈哈 wcowfjwogjwoiejfiow 12321@qq.com 298349845fwe ctftf:iLoveiOS@qq.com
//對原數(shù)據(jù)的修改
NSMutableString *muStr = [NSMutableString stringWithString:str];
NSLog(@"%@",muStr);//clc_cfzxyq@163.com wcowfjwogjwoiejfiow 12321@qq.com 298349845fwe ctftf:iLoveiOS@qq.com
NSInteger k= [regular replaceMatchesInString:muStr options:0 range:firstRange withTemplate:@"呵呵"];
NSLog(@"%ld----%@",k,muStr);//1----呵呵 wcowfjwogjwoiejfiow 12321@qq.com 298349845fwe ctftf:iLoveiOS@qq.com
//自定義替換
NSMutableString *muStr1 = [str mutableCopy];
NSInteger offset = 0;
for (NSTextCheckingResult *result in arry) {
NSRange resultRange = result.range;
resultRange.location +=offset;
NSString *newStr1 = [regular replacementStringForResult:result
inString:muStr1
offset:offset
template:@"$0"];
NSString* replacement=nil;
if ([newStr1 isEqualToString:@"clc_cfzxyq@163.com"]) {
replacement = @"ONE";
} else if ([newStr1 isEqualToString:@"12321@qq.com"]) {
replacement = @"TWO";
} else if ([newStr1 isEqualToString:@"iLoveiOS@qq.com"]) {
replacement = @"THREE";
}
[muStr1 replaceCharactersInRange:resultRange withString:replacement];
offset += ([replacement length] - resultRange.length);
};
NSLog(@"%@",muStr1);//ONE wcowfjwogjwoiejfiow TWO 298349845fwe ctftf THREE
NSPredicate
NSString *email = @"Yxwl_zsab1@126.com";
NSString *regex = @"\\w+@\\w+\\.[a-zA-Z0-9]{2,4}";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
BOOL isValid = [predicate evaluateWithObject:email];