iOS 擷取所有子字串Rang

來源:互聯網
上載者:User

標籤:字元   integer   ini   優缺點   對象   fst   開發   避免   sea   

現在APP開發對效果要求越來與豐富,各種特效層出不窮。其中以動畫效果和文字以富文本展示居多。

在網上也看了好幾種方法,感覺有的處理的麻煩了,下面是我總結的擷取子字串所有Rang的一些方法:

字串做富文本處理需要通過NSMutableAttributedString來處理,先建立一個NSMutableAttributedString對象:

NSMutableAttributedString *attribtStr = [[NSMutableAttributedString alloc] initWithString:@"父字串"];

1、使用NSRegularExpression來處理

//初始化NSRegularExpression  
NSRegularExpression *regularExpression = [NSRegularExpression regularExpressionWithPattern:@"你的Regex" options:0 error:nil];//遍曆字串,usingBlock中返回子字串的狀態,在usingBlock中處理子字串
[regularExpression enumerateMatchesInString:attribtStr.string options:0 range:NSMakeRange(0, attribtStr.string.length) usingBlock:^(NSTextCheckingResult * _Nullable result, NSMatchingFlags flags, BOOL * _Nonnull stop) { //給子字串添加雙刪除線 [attribtStr addAttribute:NSStrikethroughStyleAttributeName value:[NSNumber numberWithInteger:NSUnderlineStyleDouble] range:result.range]; //刪除線設定為紅色 [attribtStr addAttribute:NSStrikethroughColorAttributeName value:[UIColor redColor] range:result.range]; }];

上面方法是直接在遍曆中處理匹配的子字串,下面的是先得到所有子字串的狀態集,再做對應處理:

NSArray *regularExpressionArr = [regularExpression matchesInString:attribtStr.string options:0 range:NSMakeRange(0, attribtStr.string.length)];

得到子字串的數組集合,需要做什麼處理,通過迴圈判斷就可以完成了。

for (NSTextCheckingResult *result in regularExpressionArr) {        NSRange rang = [result range];        NSLog(@"%lu",rang.location);                [attribtStr addAttribute:NSStrikethroughStyleAttributeName value:[NSNumber numberWithInteger:NSUnderlineStyleDouble] range:result.range];        [attribtStr addAttribute:NSStrikethroughColorAttributeName value:[UIColor redColor] range:result.range];    }

NSRegularExpression的下面幾個方法在其他情況下也是很好用的:

//擷取子字串數目
- (NSUInteger)numberOfMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;//擷取第一個子字串的NSTextCheckingResult
- (nullable NSTextCheckingResult *)firstMatchInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;//擷取指定rang內第一個符合要求的子字串
- (NSRange)rangeOfFirstMatchInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;

2.通過遞迴獲得所有子字串的rang數組(遞迴的優缺點就不在扯了,慎用)

//通過遞迴擷取所有子字串location- (void)rangeOfString:(NSString*)searchString fatherString:(NSString*)fatherStr options:(NSStringCompareOptions)mask range:(NSRange)rangeOfReceiverToSearch {//擷取指定範圍內第一個匹配的子字串rang,和上面NSRegularExpression的一個方法效果一樣
NSRange rang = [fatherStr rangeOfString:searchString options:mask range:rangeOfReceiverToSearch];
//判斷搜尋範圍來決定是否完成搜尋 if (rang.location >fatherStr.length - searchString.length) { return; }
//NSRang不能儲存在數組中,所以這裡存的是rang的location [strLocationRangArr addObject:[NSNumber numberWithInteger:rang.location]];
//遞迴搜尋 [self rangeOfString:searchString fatherString:fatherStr options:mask range:NSMakeRange(rang.location+searchString.length, fatherStr.length-rang.location-searchString.length)];}

調用樣本:

strLocationRangArr = [NSMutableArray array];    [self rangeOfString:@"CoreText" fatherString:attribtStr.string options:0 range:NSMakeRange(0, attribtStr.string.length)];    for (NSNumber *location in strLocationRangArr) {        [attribtStr addAttribute:NSStrikethroughStyleAttributeName value:[NSNumber numberWithInteger:NSUnderlineStyleDouble] range:NSMakeRange([location integerValue], 8)];        [attribtStr addAttribute:NSStrikethroughColorAttributeName value:[UIColor redColor] range:NSMakeRange([location integerValue], 8)];    }

3.通過字串- (NSArray<NSString *> *)componentsSeparatedByString:(NSString *)separator;方法獲得的切割數組處理獲得子字串rang集合。

 NSArray *arr = [attribtStr.string componentsSeparatedByString:@"searchString"];

通過數組的子字串去匹配attribtStr.string擷取searchString的location,

這種方法需要處理的地方比較多,首先要考慮arr中第一個、最後一個和連續的是否是@“”,在著就是數組中不可避免會出現相同切割為相同的子串。

例如:@“123654789123654789”這樣要[email protected]“654”就會出現兩個@“123”和@“789”,在判斷的時候要在此處處理重複問題,小的表示有了上面兩種方法就沒有在對這種想法再做深入的實現。

相對NSRegularExpression的簡單快速的,其他方法用來作為思路還是不錯的。

iOS 擷取所有子字串Rang

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.