ios - 获取标题的第一个实际字母/数字

标签 ios objective-c regex cocoa-touch nsstring

我正在尝试获取标题的第一个字母/数字,这是一个对象的 NSString 属性。该属性有时可能为 nil 或 = @"",因此我需要对此进行补偿。如果 标题以数字开头,我需要返回@"#"。如果它以“The Cup”开头,我需要返回“C”而不考虑“The”。如果它是空的,我需要返回 U 表示未知。

我已经创建了以下脚本,但在搜索 1000 个标题时速度非常慢。有时我还会收到 -[__NSCFString substringToIndex:]: Index 1 out of bounds;字符串长度 0。我认为这与空字符串有关?我可以使用任何其他方法(例如正则表达式或其他方法)来加快查询速度吗?

- (NSString *)firstLetterInTitle{
        NSString *newString = [self.title uppercaseString];
        NSNumberFormatter *f = [[NSNumberFormatter alloc] init];
            if([newString length] >= 1){
                if([f numberFromString:[newString substringToIndex:1]] != nil){
                    //All Numbers
                    _firstLetterInTitle = @"#";
                    return _firstLetterInTitle;
                }

                //" Hello"
                if([newString length] >= 2){
                    if([[newString substringToIndex:1] isEqualToString:@" "]){
                        newString = [newString stringByTrimmingCharactersInSet:
                             [NSCharacterSet whitespaceCharacterSet]];
                //Returns "Hello"
                    }
                }

        if([newString length] >= 5){
            if([[newString substringToIndex:4] isEqualToString:@"THE "]){
                newString = [newString substringFromIndex:4];
            }
        }

    }else{
        _firstLetterInTitle = @"U";
        return _firstLetterInTitle;
    }

    newString = [[newString componentsSeparatedByCharactersInSet:[[NSCharacterSet letterCharacterSet] invertedSet]] componentsJoinedByString:@""];
    if([newString length] >= 1){
        _firstLetterInTitle = [newString substringToIndex:1];
    }else{
        _firstLetterInTitle = @"U";
    }
        return _firstLetterInTitle;
}

最佳答案

这应该会快一些

- (NSString *)firstLetterInTitle
{
    if (!self.title || ([self.title isEqualToString:@""])) {
        return @"U";
    }

    if ([[NSCharacterSet decimalDigitCharacterSet] characterIsMember:[self.title characterAtIndex:0]]) {
        return @"#";
    }

    NSString *newString = [self.title uppercaseString];
    if (([newString hasPrefix:@"THE "]) && ([newString length > 4)) {
        newString = [newString substringFromIndex:4];
    }

    return [newString substringToIndex:1];
}

关于ios - 获取标题的第一个实际字母/数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19392106/

相关文章:

ios - Core Image 从磁盘上的视频中获取样本缓冲区?

ios - 跨多个线程的 println() 导致混合消息

iphone - 如何跟踪 AVAssetWriter 的写入进度?

java - 在哪里可以找到将正则表达式应用于输出的 Java Servlet 过滤器?

regex - 更改 awk 模式中的正则表达式分隔符

iOS 内存应用关闭

ios - Bundle creator 操作系统类型代码 ???在 Xcode 4 中

objective-c - 为什么 Reachability 类会为 iOS8 返回意想不到的结果?

ios - 定位以编程方式创建的 UIButton

javascript - 为什么我的 JavaScript 代码没有按预期运行?