NSString簡單細說(十一)—— 字符串的查找

版本記錄

版本號 時間
V1.0 2017.05.18

前言

前面我簡單的寫了些NSString的初始化,寫了幾篇,都不難,但是可以對新手有一定的小幫助,對于大神級人物可以略過這幾篇,NSString本來就沒有難的,都是細枝末節,忘記了查一下就會了,沒有技術難點,下面我們繼續~~~
1. NSString簡單細說(一)—— NSString整體架構
2. NSString簡單細說(二)—— NSString的初始化
3. NSString簡單細說(三)—— NSString初始化
4. NSString簡單細說(四)—— 從URL初始化
5. NSString簡單細說(五)—— 向文件或者URL寫入
6. NSString簡單細說(六)—— 字符串的長度
7. NSString簡單細說(七)—— 與C字符串的轉化
8. NSString簡單細說(八)—— 識別和比較字符串
9. NSString簡單細說(九)—— 字符串的合并
10. NSString簡單細說(十)—— 字符串的分解

字符串的查找

一、- (BOOL)containsString:(NSString *)str;

看代碼

    /**
     * 1. - (BOOL)containsString:(NSString *)str;;
     *
     *  @param str:The string to search for. This value must not be nil.
     *
     *  @return :YES if the receiver contains str, otherwise NO.
     *
     */
    
    NSString *testStr = @"AAAasdWIU";
    BOOL isContain = [testStr containsString:@"asd"];
    NSLog(@"%d--isContain",isContain);
    BOOL isContain1 = [testStr containsString:@"asD"];
    NSLog(@"%d--isContain1",isContain1);

看結果

2017-05-18 22:52:39.361 NSString你會用嗎?[984:24027] 1--isContain
2017-05-18 22:52:39.361 NSString你會用嗎?[984:24027] 0--isContain1

結論:從上面可以看到:

  • 這個包含的判斷是有大小寫之分的,也就是casesensitive的。
  • 這個方法其實和rangeOfString:options: 方法中不傳option的時候是等價的。
  • 當用于和用戶端呈現的時候需要使用localizedStandardContainsString: 或者localizedCaseInsensitiveContainsString: 方法。

二、- (BOOL)localizedCaseInsensitiveContainsString:(NSString *)str;

先看代碼

    /**
     * 2. - (BOOL)localizedCaseInsensitiveContainsString:(NSString *)str;
     *
     *  @param str:The string to search for. This value must not be nil.
     *
     *  @return :YES if the receiver contains str, otherwise NO.
     *
     */
    
    NSString *testStr = @"AAAasdWIU";
    BOOL isContain = [testStr localizedCaseInsensitiveContainsString:@"asd"];
    NSLog(@"%d--isContain",isContain);
    BOOL isContain1 = [testStr localizedCaseInsensitiveContainsString:@"asD"];
    NSLog(@"%d--isContain",isContain1);

看結果

2017-05-18 23:04:13.618 NSString你會用嗎?[1138:32102] 1--isContain
2017-05-18 23:04:13.618 NSString你會用嗎?[1138:32102] 1--isContain

結論:由上可知:

  • 這個是不區分大小寫的,也就是說是CaseInsensitive的。

三、- (BOOL)localizedStandardContainsString:(NSString *)str;

看代碼

    /**
     * 3. - (BOOL)localizedStandardContainsString:(NSString *)str;
     *
     *  @param str:The string to search for. This value must not be nil.
     *
     *  @return :YES if the receiver contains str, otherwise NO.
     *
     */

    NSString *testStr = @"AAAasdWIU";
    BOOL isContain = [testStr localizedStandardContainsString:@"asd"];
    NSLog(@"%d--isContain",isContain);
    BOOL isContain1 = [testStr localizedStandardContainsString:@"asD"];
    NSLog(@"%d--isContain",isContain1);

看結果

2017-05-18 23:14:39.764 NSString你會用嗎?[1285:42492] 1--isContain
2017-05-18 23:14:39.764 NSString你會用嗎?[1285:42492] 1--isContain

結論:這個方法也是不缺分大小寫字母的。


四、- (NSRange)rangeOfCharacterFromSet:(NSCharacterSet *)searchSet;

看代碼


    /**
     * 4. - (NSRange)rangeOfCharacterFromSet:(NSCharacterSet *)searchSet;
     *
     *  @param searchSet:A character set. This value must not be nil.
     *
     *  @return :The range in the receiver of the first character found from aSet. Returns a range of {NSNotFound, 0} if none of the characters in aSet are found.    
     *
     */
    
    NSString *testStr = @"AAAasdWIU";
    NSCharacterSet *characterSet = [NSCharacterSet lowercaseLetterCharacterSet];
    NSRange range = [testStr rangeOfCharacterFromSet:characterSet];
    NSLog(@"range--location=%ld--lengh=%ld",range.location,range.length);
    
    NSCharacterSet *characterSet1 = [NSCharacterSet uppercaseLetterCharacterSet];
    NSRange range1 = [testStr rangeOfCharacterFromSet:characterSet1];
    NSLog(@"range1--location=%ld--lengh=%ld",range1.location,range1.length);


看結果

2017-05-18 23:26:24.941 NSString你會用嗎?[1457:52949] range--location=3--lengh=1
2017-05-18 23:26:24.941 NSString你會用嗎?[1457:52949] range1--location=0--lengh=1

結論:由上可知:

  • 這個方法的作用就是找到character所對應的range。
  • searchSet不能為空,如為空就會拋出異常NSInvalidArgumentException。
  • 如果找不到就會返回結果{NSNotFound, 0}。
  • 這個方法和 rangeOfCharacterFromSet:options:中options為nil時是一樣的。

五、- (NSRange)rangeOfCharacterFromSet:(NSCharacterSet *)searchSet options:(NSStringCompareOptions)mask;

看代碼

    /**
     * 5. - (NSRange)rangeOfCharacterFromSet:(NSCharacterSet *)searchSet options:(NSStringCompareOptions)mask;
     *
     *  @param searchSet:A character set. This value must not be nil.
     *  @param mask:A character set. This value must not be nil.
     *
     *  @return :A mask specifying search options. The following options may be specified by combining them with the C bitwise OR operator: NSAnchoredSearch, NSBackwardsSearch.
     *
     */
    
    NSString *testStr = @"AAasdWIU";
    NSCharacterSet *characterSet = [NSCharacterSet lowercaseLetterCharacterSet];
    NSRange range = [testStr rangeOfCharacterFromSet:characterSet options:NSBackwardsSearch];
    NSLog(@"range--location=%ld--lengh=%ld",range.location,range.length);
    
    NSCharacterSet *characterSet1 = [NSCharacterSet uppercaseLetterCharacterSet];
    NSRange range1 = [testStr rangeOfCharacterFromSet:characterSet1 options:NSLiteralSearch];
    NSLog(@"range1--location=%ld--lengh=%ld",range1.location,range1.length);

看結果

2017-05-18 23:50:38.672 NSString你會用嗎?[1696:69877] range--location=4--lengh=1
2017-05-18 23:50:38.672 NSString你會用嗎?[1696:69877] range1--location=0--lengh=1


結論:由上可知

  • searchSet為空則會拋出異常。
  • 這個方法可以看做方法rangeOfCharacterFromSet:options:range:,range為整個字符串的特例。

六、- (NSRange)rangeOfCharacterFromSet:(NSCharacterSet *)searchSet options:(NSStringCompareOptions)mask range:(NSRange)rangeOfReceiverToSearch;

看代碼

    /**
     * 6. - (NSRange)rangeOfCharacterFromSet:(NSCharacterSet *)searchSet options:(NSStringCompareOptions)mask range:(NSRange)rangeOfReceiverToSearch;
     *
     *  @param searchSet:A character set. This value must not be nil.
     *  @param mask:A character set. This value must not be nil.
     *  @param rangeOfReceiverToSearch:A character set. This value must not be nil.
     *
     *  @return :The range in the receiver of the first character found from aSet within aRange. Returns a range of {NSNotFound, 0} if none of the characters in aSet are found.
     *
     */
    
    NSString *testStr = @"2AasdWAI3U";
    NSCharacterSet *characterSet = [NSCharacterSet uppercaseLetterCharacterSet];
    NSRange strRange = NSMakeRange(0, 4);
    NSRange range = [testStr rangeOfCharacterFromSet:characterSet options:NSCaseInsensitiveSearch range:strRange];
    NSLog(@"range--location=%ld--lengh=%ld",range.location,range.length);

看結果

2017-05-19 00:04:17.438 NSString你會用嗎?[1885:80771] range--location=1--lengh=1

結論:這里需要注意這個例子

  • searching the string “strüdel”—containing the decomposed characters “u” (U+0075 LATIN SMALL LETTER U) and “¨” (U+0308 COMBINING DIAERESIS)—with a character set containing the precomposed character “ü” (U+00FC LATIN SMALL LETTER U WITH DIAERESIS) would return the range {NSNotFound, 0}, because none of the characters in the set are found.

七、- (NSRange)rangeOfString:(NSString *)searchString;

看代碼

    /**
     * 7. - (NSRange)rangeOfString:(NSString *)searchString;
     *
     *  @param searchString:The string to search for.
     *
     *  @return :An NSRange structure giving the location and length in the receiver of the first occurrence of searchString.Returns {NSNotFound, 0} if searchString is not found or is empty ("").
     
     *
     */

    NSString *testStr = @"2AasdWAI3U";
    NSRange range = [testStr rangeOfString:@"as"];
    NSLog(@"range--location=%ld--lengh=%ld",range.location,range.length);

看結果

2017-05-19 00:12:35.795 NSString你會用嗎?[1975:86532] range--location=2--lengh=2

結論:由此可知

  • NSString對象的比較都是檢查它們的點序列的unicode是否相等,所以返回的searchString的區間range是不同的。所以字符序列相等的字符串也可能長度是不同的。
  • 當要呈現給用戶的時候,用這個方法localizedStandardRangeOfString:。

八、- (NSRange)rangeOfString:(NSString *)searchString options:(NSStringCompareOptions)mask;

看代碼

    /**
     * 8. - (NSRange)rangeOfString:(NSString *)searchString options:(NSStringCompareOptions)mask;
     *
     *  @param searchString:The string to search for.
     *  @param mask:A mask specifying search options. For possible values, see NSStringCompareOptions.
     *
     *  @return :An NSRange structure giving the location and length in the receiver of the first occurrence of searchString.Returns {NSNotFound, 0} if searchString is not found or is empty ("").
     
     *
     */
    
    NSString *testStr = @"2AasdWAI3U";
    NSRange range = [testStr rangeOfString:@"2" options:NSNumericSearch];
    NSLog(@"range--location=%ld--lengh=%ld",range.location,range.length);

看結果

2017-05-19 00:27:03.481 NSString你會用嗎?[2205:98656] range--location=0--lengh=1

結論:這個很簡單,就不多說了。


九、- (NSRange)rangeOfString:(NSString *)searchString options:(NSStringCompareOptions)mask range:(NSRange)rangeOfReceiverToSearch;

看代碼

    /**
     * 9. - (NSRange)rangeOfString:(NSString *)searchString options:(NSStringCompareOptions)mask range:(NSRange)rangeOfReceiverToSearch;
     *
     *  @param searchString:The string to search for.
     *  @param mask:A mask specifying search options. For possible values, see NSStringCompareOptions.
     *  @param rangeOfReceiverToSearch:The range within the receiver for which to search for aString.Raises an NSRangeException if rangeOfReceiverToSearch is invalid.
     *
     *  @return :An NSRange structure giving the location and length in the receiver of searchString
     within rangeOfReceiverToSearch in the receiver, modulo the options in mask. The range returned is relative to the start of the string, not to the passed-in range. Returns {NSNotFound, 0} if searchString is not found or is empty ("").
     *
     */
    
    NSString *testStr = @"2AasdWAI3U";
    NSRange range = NSMakeRange(0, 4);
    NSRange range1 = [testStr rangeOfString:@"3" options:NSNumericSearch range:range];
    NSLog(@"range1--location=%ld--lengh=%ld",range1.location,range1.length);


看結果

2017-05-19 00:34:17.048 NSString你會用嗎?[2301:104399] range1--location=9223372036854775807--lengh=0


結論:這個很簡單。當要呈現給用戶的時候,應該使用方法localizedStandardRangeOfString:


十、- (NSRange)rangeOfString:(NSString ***)searchString options:(NSStringCompareOptions)mask range:(NSRange)rangeOfReceiverToSearch locale:(NSLocale **)locale;

這個方法參數比較多,先看一下參數配置吧。

參數配置

看代碼

    /**
     * 10. - (NSRange)rangeOfString:(NSString *)searchString options:(NSStringCompareOptions)mask range:(NSRange)rangeOfReceiverToSearch locale:(NSLocale *)locale;
     *
     *  @param searchString:The string to search for.
     *  @param mask:A mask specifying search options. For possible values, see NSStringCompareOptions.
     *  @param rangeOfReceiverToSearch:The range within the receiver for which to search for aString.Raises an NSRangeException if rangeOfReceiverToSearch is invalid.
     *  @param locale:The locale to use when comparing the receiver with aString. To use the current locale, pass [NSLocale currentLocale]. To use the system locale, pass nil.
     The locale argument affects the equality checking algorithm. For example, for the Turkish locale, case-insensitive compare matches “I” to “?” (U+0131 LATIN SMALL DOTLESS I), not the normal “i” character.

     *
     *  @return :An NSRange structure giving the location and length in the receiver of aString within aRange in the receiver, modulo the options in mask. The range returned is relative to the start of the string, not to the passed-in range. Returns {NSNotFound, 0} if aString is not found or is empty ("").
     *
     */

    NSString *testStr = @"2AasdWAI3U";
    NSRange range = NSMakeRange(0, 4);
    NSRange range1 = [testStr rangeOfString:@"3" options:NSNumericSearch range:range locale:nil];
    NSLog(@"range1--location=%ld--lengh=%ld",range1.location,range1.length);

看結果

2017-05-19 00:44:22.482 NSString你會用嗎?[2422:112275] range1--location=9223372036854775807--lengh=0

結論:自己看代碼和過程。當呈現給用戶時,要使用下面這個方法 localizedStandardRangeOfString:


十一、- (NSRange)localizedStandardRangeOfString:(NSString *)str;

看代碼

    /**
     * 11. - (NSRange)localizedStandardRangeOfString:(NSString *)str;
     *
     *  @param str:The string to search for. This value must not be nil.
     *
     *  @return :An NSRange structure giving the location and length in the receiver of aString within aRange in the receiver, modulo the options in mask. The range returned is relative to the start of the string, not to the passed-in range. Returns {NSNotFound, 0} if aString is not found or is empty ("").
     *
     */
    
    NSString *testStr = @"2AasdWAI3U";
    NSRange range1 = [testStr localizedStandardRangeOfString:@"aa"];
    NSLog(@"range1--location=%ld--lengh=%ld",range1.location,range1.length);

看結果

2017-05-19 00:50:58.881 NSString你會用嗎?[2520:117628] range1--location=1--lengh=2

結論:這里的比較就是不區分大小寫字母的比較。


十二、- (void)enumerateLinesUsingBlock:(void (^)(NSString **line, BOOL ***stop))block;

這個方法其實就是枚舉器的使用,數組和字典都有這個類似方法。這個方法與 (for(... in ...)在效率上基本一致,有時會快些我們先看一下block這個參數

block參數

我們先準備個文件

準備文件

看代碼

    /**
     * 12. - (void)enumerateLinesUsingBlock:(void (^)(NSString *line, BOOL *stop))block;
     *
     *  @param block:The block executed for the enumeration.The block takes two arguments:
     *
     */
    
    //字符串
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"txt"];
    NSData *fileData = [NSData dataWithContentsOfFile:filePath];
    NSString *fileStr = [[NSString alloc] initWithData:fileData encoding:NSUTF8StringEncoding];
    
    //一行一行的讀取
    [fileStr enumerateLinesUsingBlock:^(NSString * _Nonnull line, BOOL * _Nonnull stop) {
        
        NSLog(@"%@---line",line);
        
    }];

看結果

2017-05-19 01:03:16.160 NSString你會用嗎?[2780:127173] AASsswj1wjihoi`w`9897298`7298`2@&#&%#*(&)!&)!AASsswj---line
2017-05-19 01:03:16.160 NSString你會用嗎?[2780:127173] 1wjihoi`w`9897298`7298`2@&#&%#*(&)!&)!---line

結論:枚舉器的使用。


十三、- (void)enumerateSubstringsInRange:(NSRange)range options:(NSStringEnumerationOptions)opts usingBlock:(void (^)(NSString **substring, NSRange substringRange, NSRange enclosingRange, BOOL ***stop))block;

看參數,如下圖

枚舉參數

這里還有個枚舉值NSStringEnumerationOptions

typedef NS_OPTIONS(NSUInteger, NSStringEnumerationOptions) {
    // Pass in one of the "By" options:
    NSStringEnumerationByLines = 0,                       // Equivalent to lineRangeForRange:
    NSStringEnumerationByParagraphs = 1,                  // Equivalent to paragraphRangeForRange:
    NSStringEnumerationByComposedCharacterSequences = 2,  // Equivalent to rangeOfComposedCharacterSequencesForRange:
    NSStringEnumerationByWords = 3,
    NSStringEnumerationBySentences = 4,
    // ...and combine any of the desired additional options:
    NSStringEnumerationReverse = 1UL << 8,
    NSStringEnumerationSubstringNotRequired = 1UL << 9,
    NSStringEnumerationLocalized = 1UL << 10              // User's default locale
};

看代碼

    /**
     * 13. - (void)enumerateSubstringsInRange:(NSRange)range options:(NSStringEnumerationOptions)opts usingBlock:(void (^)(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop))block;
     *
     *  @param range:The range within the string to enumerate substrings.
     *  @param opts:Options specifying types of substrings and enumeration styles.
     *  @param block:The block executed for the enumeration.The block takes four arguments.
     *
     */
    
    //字符串
    NSString *fileStr = @"212ehohgivieye0ohsoIFIFUFYDST";
    NSRange range = NSMakeRange(0, 10);
    
    //一個字符一字符的讀取
    [fileStr enumerateSubstringsInRange:range options:NSStringEnumerationByWords usingBlock:^(NSString * _Nullable substring, NSRange substringRange, NSRange enclosingRange, BOOL * _Nonnull stop) {
        NSLog(@"%@--substring",substring);
    }];

看結果

2017-05-19 01:22:41.689 NSString你會用嗎?[3266:146676] 212ehohgiv--substring

結論:需要注意

  • If this method is sent to an instance of NSMutableString, mutation (deletion, addition, or change) is allowed, as long as it is within enclosingRange. After a mutation, the enumeration continues with the range immediately following the processed range, after the length of the processed range is adjusted for the mutation. (The enumerator assumes any change in length occurs in the specified range.)
  • For example, if the block is called with a range starting at location N, and the block deletes all the characters in the supplied range, the next call will also pass N as the index of the range. This is the case even if mutation of the previous range changes the string in such a way that the following substring would have extended to include the already enumerated range. For example, if the string "Hello World" is enumerated via words, and the block changes "Hello " to "Hello", thus forming "HelloWorld", the next enumeration will return "World" rather than "HelloWorld".

后記

很晚了,睡覺了。待續~~~~~

花海
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容