正则表达式是从NSString中的票号中提取数字的正确方法吗?

时间:2013-09-22 19:26:05

标签: objective-c regex string cocoa-touch nsstring

我想以编程方式接收JIRA票号,例如@"ART-235",并获取裸号/ @"235"

我询问有关使用正则表达式的问题显示Regular expressions in an Objective-C Cocoa application带有https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSRegularExpression_Class/Reference/Reference.html的链接,看起来我确实可以使用\D*?(\d+)这样的正则表达式并检索值通过正则表达式。

但是,我想检查并询问是否有更少的bletcherous方式来做这个,或者这是为什么Objective-C被称为有点过时的一个例子?第二个链接给出了我需要的一切,但它闻起来有点滑稽。对于上面提到的目标,我是否想要使用正则表达式,还是有更好的惯用方法来执行这种字符串操作?

4 个答案:

答案 0 :(得分:3)

听起来像-componentsSeparatedByString:会做你需要的。

答案 1 :(得分:3)

获取不使用成对分隔符或嵌套的固定,已知格式的片段正好正则表达式所做的事情。我不认为在这里使用它有什么问题。

然而,为了解决您所写的问题(关于“迭代”),您可能希望查看NSScanner,它通过“字符类”移动字符串的字符,允许您评估它们你走了。

NSString * ticket = @"ART-235";

NSScanner * scanner = [NSScanner scannerWithString:ticket];
[scanner scanUpToCharactersFromSet:[NSCharacterSet decimalDigitCharacterSet]
                        intoString:nil];

// As an integer
NSInteger ticketNumber;
[scanner scanInteger:&ticketNumber];

// Or as a string
NSString * ticketNumber;
[scanner scanCharactersFromSet:[NSCharacterSet decimalDigitCharacterSet] 
                    intoString:&ticketNumber];

答案 2 :(得分:2)

就像其他答案已经说过的那样:可以使用componentsSeparatedByString:@"-"来解决这个简单的案例。

那就是说,你原来的问题是如何枚举个别角色。

并非所有字符都具有相同的大小,某些语言将多个字符组合成新语言。枚举这样的字符串时,您很可能希望获得该组合的结果,而不是单个部分。在Objective-C中,您可以枚举这些组成的字符:

NSString *myString = @"Hello Strings!";
[myString enumerateSubstringsInRange:NSMakeRange(0, myString.length)
                             options:NSStringEnumerationByComposedCharacterSequences
                          usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
                                  // Do something with the composed character 
                                  NSLog(@"%@", substring);
                              }];

上面的示例将逐个记录每个字符。

答案 3 :(得分:0)

我为你制作了一个简单的方法,只要你能做到这一点 票证标识符将始终采用“字符串数字”格式!

-(int) numberFromJiraTicket:(NSString*)ticketId
{
    //Get number as string
    NSString *number = [[ticketId componentsSeparatedByString:@"-"] lastObject];

    //Return the INT representation of the number
    return [number intValue];
}