我正在编写一个通过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中连续找到两个大写单词?
答案 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一样简单,把所有的匹配作为你的单词,或者加入名字。