从String中提取名称

时间:2013-06-16 13:10:51

标签: objective-c nsstring

我对NSString操作很新,并且在使用任何语言操作字符串方面都没有太多经验。

我的问题是我有一个包含大量数据的字符串,在这个数据中是一个我需要提取到新NSString的名称。 EG:

NSString* dataString =@"randomdata12359123888585/name_john_randomdatawadapoawdk"

“/ name_”始终位于我需要的数据之前,“_”始终跟在它之后。

我已经研究过NSScanner之类的东西但是我不太确定正确的方法是什么或者如何实现NSScanner。

3 个答案:

答案 0 :(得分:3)

您的字符串格式定义得非常明确(正如您所说,您所追求的名称​​始终前面带有“/ name_”而总是后跟“_” ),我认为名称(“john”)因此不能包含下划线。

因此,我会考虑一个简单的正则表达式,它非常适合这类问题:

NSString *regexPattern = @"^.*/name_(.*?)_.*$";

NSString *name = [dataString stringByReplacingOccurrencesOfString: regexPattern 
                                                       withString: @"$1"
                                                          options: NSRegularExpressionSearch
                                                            range: NSMakeRange(0, dataString.length)];

如果你不熟悉正则表达式,那么这里发生的是:

  1. 从字符串的开头(“^”)
  2. 开始
  3. 允许任何内容(“。*”)后跟“/ name _”
  4. 捕获后面的内容(括号表示“捕获此”)
  5. 在括号中,允许任何内容(“。*”),但要尽可能短(“*”之后的“?”)
  6. 必须后跟一个下划线,然后允许任何碰巧出现在字符串末尾的任何内容(“$”)
  7. 这将匹配整个字符串,并且当用“$ 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;
    }

}

}