连续发现2个大写单词NSString

时间:2011-11-01 21:49:35

标签: objective-c nsstring

我正在编写一个通过NSString的Mac应用程序,并将所有单词添加到NSArray(通过基于空格分隔它们)。现在,我已经整个系统崩溃了,但我还有一个小问题:名字(第一个+最后一个),被添加为两个不同的单词,这对我来说很麻烦。

我想到了几个解决方案来解决这个问题。我最好的想法是,在实际将单词添加到数组之前,将两个单词连接成大写。然后,通过if语句,确定一个单词中是否有两个大写字母,然后拆分该单词并将其添加为一个单词。但是,我找不到用大写字母连续找到2个单词的方法。

我是否应该使用RegexKitLite(我不熟悉),例如,连续找到两个大写单词?我已经看到了这个问题:Regexp to pull capitalized words not at the beginning of sentence and two adjacent words

似乎有点相关,但由于我对正则表达式缺乏了解,我真的不知道这是否正是我所需要的。

我也看到了这一点:Separating NSString into NSArray, but allowing quotes to group words 这也是类似的,但并不完全适应我的需要。

因此,总而言之,是否有人知道如何在NSString中加入大写单词,或者甚至更好,如何在NSString中连续找到两个大写单词?

3 个答案:

答案 0 :(得分:2)

如果您的目标是iOS 4.0或更高版本的OR OS 10.7,则可以使用NSRegularExpression

NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression
  regularExpressionWithPattern:@"[A-Z]\\w*\\s[A-Z]\\w*"
  options:nil
  error:&error];

NSString *inputString = @"One two Three Four five six Seven Eight";
NSArray *stringsWithTwoCapitalizedWordsInARow = [regex
  matchesInString:inputString
  options:0
  range:NSMakeRange(0, [string length])];

你会得到类似的东西

[“Three Four”,“Seven Eigth”]

答案 1 :(得分:1)

在加载后,您可以在结果数组上进行第二次传递,以将需要连接的条目追加到一起。

众所周知,名称很难与单独的正则表达式匹配,因为名称(第一个或最后一个)本身包含空格并非闻所未闻。

NSMutableArray* words = ...;
NSMutableArray* joinedWords = [NSMutableArray array];

for (int i=0; i < [words length]; i++)
{
    NSString* currentLine = [words objectAtIndex:i];
    bool capitalized = false;
    bool capitalizedNext = false;

    capitalized = isCap(currentLine); // Up to your discretion here

    NSString* nextLine = nil;

    // for the last entry
    if (i+1 < [words length])
    {
        nextLine = [words objectAtIndex:i+1];
        capitalizedNext = isCap(nextLine);
    }

    // Check if first letter is uppercase
    if (capitalized == true && capitalizedNext == true)
    {
            [words replaceObjectAtIndex:i withObject:[NSString stringWithFormat:@"%@ %@", currentLine, nextLine];
            [words removeObjectAtIndex:i+1];

            // Run test again on new version of the line
            i--;
    }
    else
    {
        [joinedWords addObject:currentLine];
    }
}

答案 2 :(得分:0)

[A-Z][A-Za-z]* [A-Z][A-Za-z]*|[\S]*

http://rubular.com/r/DrOabOAfBr

我为你写了一个正则表达式。这个正则表达式会尝试先匹配一个名字,然后再回到一个单词,所以你的工作就像把它输入NSRegularExpression一样简单,把所有的匹配作为你的单词,或者加入名字。