Objective-C - 如何从NSString的开头和结尾修剪字符

时间:2015-05-16 03:32:57

标签: objective-c nsstring

我一直在寻找具体内容如下:

我输入了字符串,其中源代码如下:

Z8 - Z8 FAIRLAND PARK(147)

我最终想要的是:

Z8 FAIRLAND PARK

我可以创建第一部分ok:

NSArray* parts = [tempString componentsSeparatedByString:@"- "];
NSString* result = [parts count] > 1 ? [parts objectAtIndex: 1] : [parts objectAtIndex: 0];
//NSLog (@"result: %@", result);    

我可以通过以下方式完成后一部分:

if ([result length] > 0) {
    result = [result substringToIndex:[result length] - 5];
}   

但我知道这很好。 什么是更好的方式?

更新:

尝试回应评论和想法:

这是一个更大的数据集样本:(注意Z9路由 - 它在数据源处被截断。

我想我也可以截断名称字段中的所有路由信息,并使用RouteID作为名称。

    {
    Name = "Z8 - Z8 FAIRLAND          (147)";
    RouteID = Z8c;
},
    {
    Name = "Z8 - Z8 FAIRLAND          (147)";
    RouteID = Z8v1;
},
    {
    Name = "Z8 - Z8 FAIRLAND          (147)";
    RouteID = Z8v2;
},
    {
    Name = "Z8 - Z8 FAIRLAND          (147)";
    RouteID = Z8v3;
},
    {
    Name = "Z8 - Z8 FAIRLAND          (147)";
    RouteID = Z8v4;
},
    {
    Name = "Z8 - Z8 FAIRLAND          (147)";
    RouteID = Z8v5;
},
    {
    Name = "Z8 - Z8 FAIRLAND          (147)";
    RouteID = Z8v9;
},
    {
    Name = "Z9 - Z9 LAUREL-BURTONSVILL EXP (104";
    RouteID = Z9;
},
    {
    Name = "Z9 - Z9 LAUREL-BURTONSVILL EXP (104";
    RouteID = Z9c;
},
    {
    Name = "Z9 - Z9 LAUREL-BURTONSVILL EXP (104";

1 个答案:

答案 0 :(得分:2)

这似乎是正则表达式的一个很好的候选者,例如修剪-之前的所有内容以及最后括号中的数字,如下所示:

NSError *error;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^.*? -\\s*(.*?)\\s*\\(\\d*\\)?" options:0 error:&error];
NSAssert(regex, @"regex error %@", [error localizedDescription]);

NSString *string = @"Z8 - Z8 FAIRLAND PARK (147)";
NSTextCheckingResult *match = [regex firstMatchInString:string options:0 range:NSMakeRange(0, [string length])];
if (match) {
    NSRange range = [match rangeAtIndex:1];
    NSString *result = [string substringWithRange:range];

    // use `result` here
}

这使用“捕获括号”来捕获中间的字符串。

很明显,我已经对你想要开始和结束的内容做了一些假设,但它说明了正则表达式的强大功能。