Найти 2 заглавных слова подряд - PullRequest
0 голосов
/ 02 ноября 2011

Я пишу приложение для Mac, которое проходит через NSString и добавляет все его слова в NSArray (разделяя их на основе пробелов). Теперь у меня не работает вся система, но у меня все еще есть одна маленькая проблема: имена (первый + последний) добавляются как два разных слова, и это меня беспокоит.

Я подумал о нескольких решениях, чтобы это исправить. Моя лучшая идея заключалась в том, чтобы, прежде чем на самом деле добавить слова в массив, соединить два слова в строке с заглавной буквы. Затем с помощью оператора if определите, содержит ли слово две заглавные буквы, а затем разбейте слово и добавьте его как одно слово. Однако я не могу найти способ найти 2 слова подряд с заглавными буквами.

Должен ли я использовать RegexKitLite (с которым я не знаком), например, чтобы найти два заглавных слова подряд? Я видел этот вопрос: регулярное выражение, чтобы извлечь заглавные слова не в начале предложения и двух соседних слов

, который кажется каким-то образом связанным, но из-за моего непонимания регулярных выражений, я действительно не знаю, действительно ли это то, что мне нужно.

Я также видел это: Разделение NSString на NSArray, но разрешение кавычек для группировки слов что также похоже, но не совсем адаптировано к моим потребностям.

Итак, в заключение, кто-нибудь знает, как объединить прописные слова в строке NSS или, что еще лучше, как найти два прописных слова в строке в строке NSString?

Ответы [ 3 ]

2 голосов
/ 02 ноября 2011

Если вы ориентируетесь на iOS 4.0 или более позднюю версию ИЛИ на ОС 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])];

Вы получите что-то вроде этого

["Три четверки", "Семь восьмых"]

1 голос
/ 02 ноября 2011

Вы можете просто сделать второй проход полученного массива после его загрузки, чтобы добавить записи, которые необходимо объединить.

Имена, как известно, трудно сопоставить только с регулярными выражениями, поскольку нередко имена (первые или последние) содержат сами пробелы.

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];
    }
}
0 голосов
/ 02 ноября 2011

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

http://rubular.com/r/DrOabOAfBr

Я написал для вас регулярное выражение. Это регулярное выражение будет сначала пытаться сопоставить имя, а затем вернуться к слову, поэтому ваша задача так же проста, как и передать его в NSRegularExpression, и принять все совпадения как слова или соединенные имена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...