-3

我对 NSString 操作还很陌生,并且真的没有太多用任何语言操作字符串的经验。

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

NSString* dataString =@"randomdata12359123888585/name_john_randomdatawadapoawdk"

“/name_”总是在我需要的数据之前,而“_”总是在它之后。

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

4

3 回答 3

3

您的字符串格式定义非常明确(如您所说,您所使用的名称始终以“/name_”开头,并始终以“_”开头),我认为名称(“john”)因此不能包含下划线。

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

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

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

如果您不熟悉正则表达式,这里发生的事情是:

  1. 从字符串的开头(“^”)开始
  2. 允许任何内容 (".*") 后跟 "/name_"
  3. 捕捉接下来的内容(括号的意思是“捕捉这个”)
  4. 在括号中,允许任何内容(“.*”),但尽可能短(“*”后面的“?”)
  5. 它后面必须跟一个下划线,然后允许出现在字符串末尾的任何内容(“$”)

这将匹配整个字符串,并且当用“$1”替换匹配项(即所有字符串)时,它将用第一个(也是唯一一个)括号中包含的子字符串替换匹配项。

结果:它将生成一个仅包含名称的字符串。如果字符串的格式不正确(即两个下划线之间没有名称),那么它不会更改任何内容并返回完整的原始字符串。

您是否更喜欢一种方法而不是另一种方法是编码风格的问题,但是如果您喜欢正则表达式,那么这种方法既干净又易于理解且易于维护。

正如我所看到的,其中的任何脆弱性都是由于数据格式造成的,它看起来可疑地像依赖于其他“随机”数据的东西,所以无论您选择哪种方法来解析该字符串,请确保您添加一些防御性测试检查数据格式并在意外字符串开始输入您的数据时提醒您。这可能是几年后,当你忘记了关于下划线、正则表达式和NSScanner.

于 2013-06-16T14:56:23.977 回答
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;
    }

}

}

于 2013-06-16T14:38:00.027 回答
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
)

现在您可以从数组索引中访问名称或任何内容。

于 2013-06-16T13:29:20.800 回答