OC之搜索指定字符串位置

1、查找并返回指定字符串的第一次出現的范圍

//查找并返回字符串中指定字符串的第一次出現的范圍;如果沒有找到,則返回{NSNotFound, 0}
- (NSRange)rangeOfString:(NSString *)searchString;

//根據指定設置,查找并返回字符串中指定字符串的第一次出現的范圍。
- (NSRange)rangeOfString:(NSString *)searchString options:(NSStringCompareOptions)mask;


//根據指定設置,查找并返回指定字符串在指定字符串范圍內的第一次出現的范圍。
- (NSRange)rangeOfString:(NSString *)searchString options:(NSStringCompareOptions)mask range:(NSRange)rangeOfReceiverToSearch;

//根據指定設置,使用指定的語言環(huán)境在字符串的指定范圍內查找并返回給定字符串的第一次出現的范圍。
- (NSRange)rangeOfString:(NSString *)searchString options:(NSStringCompareOptions)mask range:(NSRange)rangeOfReceiverToSearch locale:(nullable NSLocale *)locale;

1.1、case1

在一個字符串中搜索多個指定字符串

NSString *nickName1 = @"張三";
NSString *nickName2 = @"張三";
NSString *content = @"真的是不可思議啊,張三爺簡直是奇跡...";
NSString *string = [NSString stringWithFormat:@"%@說%@:%@",nickName1,nickName2,content];

NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:string attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:13],NSForegroundColorAttributeName:[UIColor colorWithRed:51/255.0 green:51/255.0 blue:51/255.0 alpha:1]}];

//搜索字符串中指定字符串的第一次出現的范圍
NSRange nick1Range = [[attributedString string] rangeOfString:nickName1];
[attributedString addAttribute:NSForegroundColorAttributeName value:[UIColor colorWithRed:74/255.0 green:144/255.0 blue:226/255.0 alpha:1] range:nick1Range];

//為避免搜索的關鍵字在前文出現過,指定搜索范圍
NSRange searchRange = NSMakeRange(nick1Range.location + nick1Range.length, attributedString.string.length - (nick1Range.location + nick1Range.length));
NSRange nick2Range = [attributedString.string rangeOfString:nickName2 options:NSCaseInsensitiveSearch range:searchRange];
[attributedString addAttribute:NSForegroundColorAttributeName value:[UIColor colorWithRed:74/255.0 green:144/255.0 blue:226/255.0 alpha:1] range:nick2Range];

//遍歷字符串中指定字符的所有位置
NSRange isRange = [attributedString.string rangeOfString:@"是"];
while (isRange.location != NSNotFound || isRange.length != 0) {
    //設置指定字符的屬性
    [attributedString addAttribute:NSForegroundColorAttributeName value:[UIColor whiteColor] range:isRange];
    [attributedString addAttribute:NSBackgroundColorAttributeName value:[UIColor redColor] range:isRange];
    //重設指定字符的位置
    NSRange searchIsRange = NSMakeRange(isRange.location + isRange.length, attributedString.string.length - (isRange.location + isRange.length));
    isRange = [attributedString.string rangeOfString:@"是" options:NSCaseInsensitiveSearch range:searchIsRange];
}

self.textView.attributedText = attributedString;

執(zhí)行上述代碼,效果如下圖所示:

富文本效果圖.png

1.2、利用正則表達式匹配特定格式的字符串

有時我們需要從一個復雜的字符串中提取指定格式的內容,這時使用正則表達式是比較輕送的方式:

NSMutableArray<NSString *> *imageURLs = [NSMutableArray array];//存儲提取的圖片地址
NSString *string = @"在字符串中提?。糹mageURL:https://timgsa.baidu.com/Fimg.jpg>多個圖片地址<imageURL:https://timgsa.baidu.com/Fimg12.jpg>,然后輸出結果";
NSString *regulaString = @"(?<=\\<imageURL:).*?(?=\\>)";//正則表達式
NSRange range = [string rangeOfString:regulaString options:NSRegularExpressionSearch];
while (range.location != NSNotFound || range.length != 0) {
    NSString *substring = [string substringWithRange:range];
    NSString *subAllString = [NSString stringWithFormat:@"<imageURL:%@>",substring];
    string = [string stringByReplacingOccurrencesOfString:subAllString withString:@" 查看圖片 "];
    range = [string rangeOfString:regulaString options:NSRegularExpressionSearch];
    if (substring) {
        [imageURLs addObject:substring];
    }
}
NSLog(@"imageURLs === %@",imageURLs);
NSLog(@"string === %@",string);
/* 打印結果:
imageURLs === (
    "https://timgsa.baidu.com/Fimg.jpg",
    "https://timgsa.baidu.com/Fimg12.jpg"
)
string === 在字符串中提取 查看圖片 多個圖片地址 查看圖片 ,然后輸出結果
*/
1.2.1、利用NSRegularExpression匹配特定格式的字符串
NSMutableArray<NSString *> *imageURLs = [NSMutableArray array];//存儲提取的圖片地址
NSString *string = @"在字符串中提?。糹mageURL:https://timgsa.baidu.com/Fimg.jpg>多個圖片地址<imageURL:https://timgsa.baidu.com/Fimg12.jpg>,然后輸出結果";
NSString *regulaString = @"(?<=\\<imageURL:).*?(?=\\>)";//正則表達式

NSError *error;
NSRegularExpression *regularExpression = [NSRegularExpression regularExpressionWithPattern:regulaString options:NSRegularExpressionCaseInsensitive error:&error];
NSArray *arrayOfAllMatches = [regularExpression matchesInString:string options:0 range:NSMakeRange(0, [string length])];
NSString *string1 = [string copy];
for (NSTextCheckingResult *match in arrayOfAllMatches)
{
    NSString *substringForMatch = [string substringWithRange:match.range];
    NSString *subAllString = [NSString stringWithFormat:@"<imageURL:%@>",substringForMatch];
    string1 = [string1 stringByReplacingOccurrencesOfString:subAllString withString:@" 查看圖片 "];

    [imageURLs addObject:substringForMatch];
}
NSLog(@"imageURLs === %@",imageURLs);
NSLog(@"string1 === %@",string1);
/* 打印結果:
imageURLs === (
    "https://timgsa.baidu.com/Fimg.jpg",
    "https://timgsa.baidu.com/Fimg12.jpg"
)
string1 === 在字符串中提取 查看圖片 多個圖片地址 查看圖片 ,然后輸出結果
*/

2、NSStringCompareOptions 設置選項

NSStringCompareOptions枚舉值用于字符串的搜索方法和比較方法。

NSStringCompareOptions枚舉值 描述
NSCaseInsensitiveSearch 不區(qū)分大小寫的搜索。
NSLiteralSearch 逐個字符比較是否相等。
NSBackwardsSearch 從字符串末尾搜索。
NSAnchoredSearch 從字符串開頭搜索.
NSNumericSearch 字符串中的數字進行比較,如 Name2.txt < Name7.txt < Name25.txt。數值比較只適用于字符串中的數字,而不適用于在數字表示中有意義的其他字符,如負號、逗號或小數點。此選項僅適用于比較方法,不適用于搜索方法。
NSDiacriticInsensitiveSearch 搜索忽略聲調。
NSWidthInsensitiveSearch 搜索忽略了具有全寬度和半寬度形式的字符的寬度差異,就像東亞字符集一樣。例如,寬屏拉丁小字母“a”(U + FF41)等于基本拉丁小字母“a”(U + 0061)。
NSForcedOrderingSearch 用于比較字符串相等:如果字符串相等但不嚴格相等,則強制比較將返回NSOrderedAscendingNSOrderedDescending。此選項確保了排序時可靠的、可重復的結果。例如,如果指定了NSCaseInsensitiveSearch,“aaa”就大于“AAA”。
NSRegularExpressionSearch 搜索字符串被視為與ICU兼容的正則表達式。如果設置,除了NSCaseInsensitiveSearchNSAnchoredSearch之外,沒有其他選項可以應用。只能將此選項與-rangeOfString:系列方法和-stringByReplacingOccurrencesOfString:withString:options:range:方法一起使用。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容