我对NSString操作很新,并且在使用任何语言操作字符串方面都没有太多经验。
我的问题是我有一个包含大量数据的字符串,在这个数据中是一个我需要提取到新NSString的名称。 EG:
NSString* dataString =@"randomdata12359123888585/name_john_randomdatawadapoawdk"
“/ name_”始终位于我需要的数据之前,“_”始终跟在它之后。
我已经研究过NSScanner之类的东西但是我不太确定正确的方法是什么或者如何实现NSScanner。
答案 0 :(得分:3)
您的字符串格式定义得非常明确(正如您所说,您所追求的名称始终前面带有“/ name_”而总是后跟“_” ),我认为名称(“john”)因此不能包含下划线。
因此,我会考虑一个简单的正则表达式,它非常适合这类问题:NSString *regexPattern = @"^.*/name_(.*?)_.*$";
NSString *name = [dataString stringByReplacingOccurrencesOfString: regexPattern
withString: @"$1"
options: NSRegularExpressionSearch
range: NSMakeRange(0, dataString.length)];
如果你不熟悉正则表达式,那么这里发生的是:
这将匹配整个字符串,并且当用“$ 1”替换匹配(即所有字符串)时,它将用第一个(也是唯一的)括号中包含的子字符串替换匹配。
结果:它将生成一个仅包含名称的字符串。如果字符串格式不正确(即两个下划线之间没有名称),那么它将不会更改任何内容并返回完整的原始字符串。
编码风格的问题是你喜欢一种方法而不是另一种方法,但如果你喜欢正则表达式,那么这种方法既干净又易于理解且易于维护。
正如我所看到的,这里的任何脆弱都是由于数据格式,它看起来很像依赖于其他“随机”数据的东西,所以无论你选择哪种方法来解析该字符串,请确保添加一些防御性测试,检查数据格式,并在意外字符串开始输入数据时提醒您。这可能是几年后,当你忘记了关于下划线,正则表达式和NSScanner
的所有内容时。
答案 1 :(得分:1)
-(void)separateString{ NSString* dataString =@"randomdata12359123888585/name_john_randomdatawadapoawdk"; NSArray *arr1 = [dataString componentsSeparatedByString:@"/"]; NSArray *arr2 = [[arr1 objectAtIndex:1] componentsSeparatedByString:@"_"]; NSLog(@"%@ %@",arr1,arr2); }
你得到的输出是
arr1= ( randomdata12359123888585, "name_john_randomdatawadapoawdk" ) arr2 = ( name, john, randomdatawadapoawdk )
现在您可以访问数组索引中的名称或其他内容。
答案 2 :(得分:1)
我设法用NSScanner做到了这一点,但阵列的答案也是如此,所以我对它进行了投票。
我用于面临类似问题的其他人的NSScanner代码是:
-(void)formatName{
NSString *stringToSearch = _URLString; //url string is the long string we wish to search.
NSScanner *scanner = [NSScanner scannerWithString:stringToSearch];
[scanner scanUpToString:@"name_" intoString:nil]; // Scan all characters before name_
while(![scanner isAtEnd]) {
NSString *substring = nil;
[scanner scanString:@"name_" intoString:nil]; // Scan the # character
if([scanner scanUpToString:@"_" intoString:&substring]) {
// If the space immediately followed the _, this will be skipped
_nameIwant = substring; //nameIwant is a property to store the name I scanned for
return;
}
}
}