Разделить NSString на слова, а затем вернуться в исходную форму - PullRequest
0 голосов
/ 22 декабря 2011

Я разделяю строку NSSt следующим образом: (строка фильтра - это строка nsstring)

seperatorSet = [NSMutableCharacterSet whitespaceAndNewlineCharacterSet];
    [seperatorSet formUnionWithCharacterSet:[NSCharacterSet punctuationCharacterSet]];
NSMutableArray *words = [[filterString componentsSeparatedByCharactersInSet:seperatorSet] mutableCopy];

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

Ответы [ 7 ]

7 голосов
/ 03 августа 2014

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

NSString * string = @" \n word1!    word2,%$?'/word3.word4   ";

[string enumerateSubstringsInRange:NSMakeRange(0, string.length)
                           options:NSStringEnumerationByWords
                        usingBlock:
 ^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
     NSLog(@"Substring: '%@'", substring);
 }];

 // Logs:
 // Substring: 'word1'
 // Substring: 'word2'
 // Substring: 'word3'
 // Substring: 'word4' 
3 голосов
/ 27 марта 2014
NSString *myString = @"Foo Bar Blah B..";
NSArray *myWords = [myString componentsSeparatedByCharactersInSet:
                    [NSCharacterSet characterSetWithCharactersInString:@" "]
                    ];
NSString* string = [myWords componentsJoinedByString: @" "];
NSLog(@"%@",string);
2 голосов
/ 22 декабря 2011

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

Единственный способ - не использовать componentsSeparatedByCharactersInSet.

Альтернативным решением может быть итерациястрока и, для каждого символа, проверьте, принадлежит ли он вашему набору символов.
Если да, добавьте символ в список и подстроку в другой список (вы можете использовать NSMutableArray class).Таким образом, например, вы знаете, что символ пунктуации между первой и второй подстрокой является первым символом в вашем списке разделителей.

2 голосов
/ 22 декабря 2011

Вы можете использовать метод pathArray componentsJoinedByString: класса массива, чтобы воссоединить слова:

NSString *orig = [words pathArray componentsJoinedByString:@" "];
2 голосов
/ 22 декабря 2011

Как вы определяете, какие слова необходимо заменить?Вместо того, чтобы разбивать его на части во-первых, возможно, будет лучше использовать -stringByReplacingOccurrencesOfString:withString:options:range:.

1 голос
/ 22 декабря 2011

Полагаю, вы не используете лучший API. Если вы действительно беспокоитесь о словах, вам следует использовать API на основе слов. Я немного сомневаюсь, будет ли это NSDataDetector или что-то еще. (Полагаю, NSRegularExpression умнее справляется с границами слов.)

0 голосов
/ 22 декабря 2011

Если вы используете Mac OS X 10.7+ или iOS 4+, вы можете использовать NSRegularExpression, Шаблон для замены слова: «\ b word \ b» - (без пробелов вокруг слово ) \ b соответствует границе слова. Посмотрите на методы replaceMatchesInString:options:range:withTemplate: и stringByReplacingMatchesInString:options:range:withTemplate:.

В 10.6 пр ранее, если вы хотите использовать регулярные выражения, вы можете обернуть функции на основе C regcomp / regexec, они также поддерживают границы слов. Однако вы можете предпочесть использовать один из других вариантов Какао, упомянутых в других ответах, для этого простого случая.

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