一些使用NSString的心得

NSString是在编程中经常使用的字符串类,我将在这里写下一些简单的操作方法。

1. 从一个指定的文件路径中(比如…/…/string.txt)获取所有字符到一个NSString。

//find the file path in order to use it [Yufei Lang 3/6/2012]
NSString *myFilePath = [[NSBundle mainBundle] pathForResource:@"string" ofType:@"txt";];
//read the file into a NSString [Yufei Lang 3/6/2012]
NSError *error;
NSString *strFileContents = [NSString stringWithContentsOfFile:myFilePath encoding:NSUTF8StringEncoding error:&error];

2. 从已有的字符串(strFileContents)中找出指定的字符串(strKeyWord),返回一个范围。

//search the entire strFileContents
[strFileContents rangeOfString: strKeyWord];
//search the strFileContents in a given range
[strFileContents rangeOfString: strKeyWord options:0 range:rangeGivenRange];

note:这样只会找到第一个符合条件的字符串,并返回一个范围(range),如果要搜索整个字符串里的关键字,你需要一个循环。
note:一个范围(range)包括一个起始点(location)和你个长度(length)。比如从6开始长度是4便是“hello world”中的“worl”。

//go and find the strKeyString, case senstive [Yufei Lang 3/6/2012]
NSUInteger count = 0, length = [strFileContents length];
NSRange range = NSMakeRange(0, length); 
while(range.location != NSNotFound)//if no match found, range.location is equal to NSNotFound
{
   range = [strFileContents rangeOfString: strKeyWord options:0 range:range];
   if(range.location != NSNotFound)
   {
       range = NSMakeRange(range.location + range.length, length - (range.location + range.length));
       count++;//make a count so you'll know how many times it appears
   }
}
NSLog(@"strKeyString: %@ has been found for %d times.",strKeyWord, count);

3. 把一个字符串中的某些字符替换成其他字符

//the following line will replace all the "strOldTargetString" to "strNewString"
NSString *strReplacedContents = [strFileContents stringByReplacingOccurrencesOfString:@"strOldTargetString" withString:@"strNewString"];
//you can alway give the range like following
NSString *strReplacedContents = [strFileContents stringByReplacingOccurrencesOfString:@"strOldTargetString" withString:@"strNewString" options:0 range:rangeGivenRange];

你或许希望在替换前先查找特定的字符,比如使用一个正则表达式,你同样会在第4条中看到正则表达式。

//this will remove all the Tabs and whitespaces etc. of a string
NSString *strNewString = [NSString stringByReplacingOccurrencesOfString:@"[ \r\n\t]+" withString:@" " options:NSRegularExpressionSearch range:NSMakeRange(0, strFileContents.length)];

4. 使用正则表达式(RegularExpression)查找特定字符

note:NSDataDetector是NSRegularExpression的一个子类,你可以用它轻松的找到常用字符,比如地址,网址,电话,email等,而不必费脑筋写出复杂的正则表达式。

NSError *error;
NSDataDetector *dataDetector = [[NSDataDetector alloc] initWithTypes:NSTextCheckingTypeLink error:&error];//this will find all the links. you can also use "|" to find more.
NSArray *arryMatchedString = [dataDetector matchesInString:strFileContents options:0 range:NSMakeRange(0, [strFileContents length])]; 

note:或者你想找出特殊字符,那就的写上自定义的正则表达式了。

//in fact, this will find you the same link
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"https?://([-\\w\\.]+)+(:\\d+)?(/([\\w/_\\.]*(\\?\\S+)?)?)?" options:NSRegularExpressionCaseInsensitive error:&error];
NSArray *arryURLs = [regex matchesInString:strFileContents options:0 range:NSMakeRange(0, [strFileContents length])];

note:需要注意的是,这两种办法返回的都是数组,数组里的每项纪录并不是简单的字符串而是一个NSTextCheckingResult类,这个类中包含了一个符合条件字符串所在原字符串里的范围(range),如果你用了DataDector,结果中还会包含一个符合条件的字符串(操作起来更为方便)。所以如果你要查询的是一个比较普通的字符串,请考虑使用DataDector,我将在下面列出DataDector支持的项。

NSTextCheckingTypeOrthography           // language identification
NSTextCheckingTypeSpelling              // spell checking
NSTextCheckingTypeGrammar               // grammar checking
NSTextCheckingTypeDate                  // date/time detection
NSTextCheckingTypeAddress               // address detection
NSTextCheckingTypeLink                  // link detection
NSTextCheckingTypeQuote                 // smart quotes
NSTextCheckingTypeDash                  // smart dashes
NSTextCheckingTypeReplacement           // fixed replacements, such as copyright symbol for (c)
NSTextCheckingTypeCorrection            // autocorrection
NSTextCheckingTypeRegularExpression     // regular expression matches
NSTextCheckingTypePhoneNumber           // phone number detection
NSTextCheckingTypeTransitInformation    // transit (e.g. flight) info detection

5. 如何把一个串字符用一个特定的字符串(Separator)分割开来,并储存在一个Array中。

NSArray *arrySeparatedStrings = [strFileContents componentsSeparatedByString:@"Separator"];

发表评论

电子邮件地址不会被公开。 必填项已用*标注