2014-12-18 2 views
0

У меня есть строка, подобная этой @"abcdefghijklmnopqrstuvwxyzA". Как вы можете видеть, A в конце. Как я могу найти первую заглавную букву и разделить строки:Разделить NSString на первую заглавную букву

NSString *lower = @"abcdefghijklmnopqrstuvwxyz"; 
NSString *upper = @"A"; 

Строка в начале статична так заглавная буква может быть все что угодно. Помог ли этот сканер?

NSString *String = titleLabelLatestNews.text; 

NSScanner *stringScanner = [NSScanner scannerWithString:String];  
NSString *content = [[NSString alloc] init]; 

while ([stringScanner isAtEnd] == NO) { 

    [stringScanner scanUpToString:@"url=\"" intoString:Nil]; 

    [stringScanner scanUpToString:@"/>" intoString:&content]; 
} 

Для другого примера, @"this is all lower case letters I am awesome"; должны стать две строки, @"this is all lower case letters"; и @"I am awesome";

Получить идею? Все, что перед письмом «Столица» переходит к строке, и что-либо после перехода к другой строке.

ответ

2

NSScanner сделает трюк для вас, да. Вам просто нужно создать NSCharacterSet, состоящий из прописных букв, а затем использовать scanUpToCharactersFromSet:intoString:

NSString * s = @"this is all lower case letters I am awesome"; 
NSScanner * scanner = [NSScanner scannerWithString:s]; 
NSString * firstPart; 
[scanner scanUpToCharactersFromSet:[NSCharacterSet uppercaseLetterCharacterSet] 
         intoString:&firstPart]; 
NSString * secondPart = [s substringFromIndex:[scanner scanLocation]]; 
+1

Если вы счастливы останавливаться на всех заглавных буквах, а не только на латинском A-Z, тогда '' uppercaseLetterCharacterSet 'NSCharacterSet' выполнит эту работу - нет необходимости в создании набора. – CRD

+0

Простота победы !!!!! : D –

-1
// Find index of first capital letter 
NSInteger index = ^NSInteger{ 
    for (NSInteger i = 0; i < string.length; ++i) { 
     unichar c = [string characterAtIndex:i]; 
     if ('A' <= c && c <= 'Z') { return i; } 
    } 

    return string.length; // No capital letter, take the entire string 
}(); 

NSLog(@"lower = %@", [string substringToIndex:index]); 
NSLog(@"upper = %@", [string substringFromIndex:index]); 
+0

Зачем вам создать анонимный блок? Цикл 'for' отлично работает сам. –

+0

@ JoshCaswell это не так, если вы думаете об этом. Блоки помогают улучшить локальность. Это может быть необязательно в этом случае, но абсолютно не «абсурдно». Больше похоже на личное предпочтение ИМХО. –

+0

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

1

Если вы настаиваете на использовании NSScanner, используйте scanCharactersFromSet:intoString: где NSCharacterSet только символы нижнего регистра.

Что бы я лично сделал, если кто-то заботится, это вызов rangeOfCharacterFromSet(NSCharacterSet.uppercaseLetterCharacterSet()...) и получить полученные подстроки оттуда.

+0

Вам не нравится 'NSScanner'? –

+0

@ JoshCaswell Это не вопрос. Я просто хочу сказать, что мой ответ предполагает, что использование NSScanner встроено в предпосылку вопроса. Если бы это был мой собственный код, я бы сделал это совершенно по-другому. – matt

+0

О, началось. Я не рассматриваю вопрос как решение на «NSScanner» в качестве решения. –

1

Лучшим решением является использование NSString в rangeOfCharacterFromSet

NSString *[email protected]""; 
NSString *[email protected]""; 
NSString *stringToSplit = titleLabelLatestNews.text; 
NSRange capitalRange=[stringToSplit rangeOfCharacterFromSet:[NSCharacterSet uppercaseLetterCharacterSet]]; 
if (capitalRange.location == NSNotFound) { 
    lowerCaseString=stringToSplit; 
} 
else if (capitalRange.location ==0) { 
    upperCaseString=stringToSplit; 
} 
else { 
    lowerCaseString=[stringToSplit substringToIndex:capitalRange.location-1]; 
    upperCaseString=[stringToSplit substringFromIndex:capitalRange.location]; 
} 

NSLog(@"lower case string=%@ uppercase=%@",lowerCaseString,upperCaseString); 
+0

@JoshCaswell Спасибо. Хорошая точка зрения. – Paulw11

+0

FYI, это вызовет исключение NSRangeException, если первая буква строки заглавна. –

+0

Спасибо. Я это исправил. – Paulw11

0

Для полноты, регулярное выражение решение:

  1. NSRegularExpression

  2. Узор @"([^A-Z]*)([A-Z].*)" будет соответствовать тому, что вы хотите, если вас интересуют только A-Z как символы верхнего регистра (см. Ниже для изменения в Юникоде). Сломанная это две группы: (...), одна для дозаправки; первая группа - все, что не является прописным, [^A-Z], ноль или более раз, *; вторая группа - заглавная буква, [A-Z], за которой следует что-либо, .*.

  3. firstMatchInString:options:range:; NSTextCheckingResult будет содержать диапазоны двух согласованных групп.

Если вы хотите, чтобы позволить несметное UNICODE в прописных и titlecase буквы просто изменить A-Z выше для \\p{Lu}\\p{Lt} (убедитесь, что вы вводите двойные обратные косые черты, вы передаете обратный слэш NSRegularExpression). Эти два являются буквами Юникода заглавными буквами, \\p{Lu} и всеми буквами заголовка, \\p{Lt}.

НТН

0

Метательный еще один раствор в смеси с использованием componentsSeparatedByCharactersInSet:, чтобы разбить строку на несколько массивов (т.е.более 2, если необходимо):

// Separate the "sentence" into components separated 
// by the characters in the uppercase character set 
NSMutableArray *sentenceArray = [[sentence componentsSeparatedByCharactersInSet:[NSCharacterSet uppercaseLetterCharacterSet]] mutableCopy]; 

// Get the first sentence "segment", i.e. the sentenceArray's 
// first object 
NSString *segment = [sentenceArray objectAtIndex:0]; 

// Keep track of the character count with a variable 
int characterCount = (int)segment.length; 

// Then starting from sentenceArray's index 1, go through 
// the rest of sentenceArray's indices 
for (int i = 1 ; i < sentenceArray.count ; i ++) { 

    // Append that "separator" character to the segment at the 
    // current index by accessing the character before the current segment 
    segment = [[NSString stringWithFormat:@"%c", [sentence characterAtIndex:characterCount]]stringByAppendingString:[sentenceArray objectAtIndex:i]]; 

    // Replace the object at the current index with this new segment 
    // string 
    [sentenceArray replaceObjectAtIndex:i withObject:segment]; 

    // Increment the character count 
    characterCount += segment.length; 
} 

NSLog(@"%@", sentenceArray); 
Смежные вопросы