将NSString拆分为单词,然后将其重新加入原始形式

时间:2011-12-21 22:30:45

标签: objective-c ios nsstring

我正在拆分这样的NSString :(过滤字符串是一个nsstring)

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

我希望将单词重新添加到带有原始标点符号和间距的过滤字符串形式中。我想这样做的原因是我想改变一些单词并将其重新组合起来。

7 个答案:

答案 0 :(得分:7)

通过单词分割的更健壮的方法是使用字符串枚举。空格并不总是分隔符,并且并非所有语言都划分空格(例如日语)。

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' 

答案 1 :(得分:3)

NSString *myString = @"Foo Bar Blah B..";
NSArray *myWords = [myString componentsSeparatedByCharactersInSet:
                    [NSCharacterSet characterSetWithCharactersInString:@" "]
                    ];
NSString* string = [myWords componentsJoinedByString: @" "];
NSLog(@"%@",string);

答案 2 :(得分:2)

您如何确定需要更换哪些字词?可能使用-stringByReplacingOccurrencesOfString:withString:options:range:更合适,而不是首先将其分开。

答案 3 :(得分:2)

您可以使用数组类的pathArray componentsJoinedByString:方法重新加入单词:

NSString *orig = [words pathArray componentsJoinedByString:@" "];

答案 4 :(得分:2)

由于您删除了原始标点符号,因此无法自动将其恢复。

唯一的方法是不使用componentsSeparatedByCharactersInSet

另一种解决方案可能是迭代字符串,并为每个字符检查它是否属于您的字符集。
如果是,请将char添加到列表中,将子字符串添加到另一个列表中(可以使用NSMutableArray类)。 这样,例如,您知道第一个和第二个子字符串之间的标点符号char是分隔符列表中的第一个字符。

答案 5 :(得分:1)

我的猜测是你可能没有使用最好的API。如果您真的担心单词,那么您应该使用基于单词的API。我对NSDataDetector还是别的什么感到有些模糊。 (我相信NSRegularExpression可以更智能地处理单词边界。)

答案 6 :(得分:0)

如果您使用的是Mac OS X 10.7+或iOS 4+,则可以使用NSRegularExpression,替换单词的模式为:“\ b word \ b” - (否 word )周围的空格\ b匹配单词边界。查看方法replaceMatchesInString:options:range:withTemplate:stringByReplacingMatchesInString:options:range:withTemplate:

如果你想使用正则表达式,你可以使用正则表达式包装regC / regexec基于C的函数,它们也支持单词边界。但是,对于这个简单的情况,您可能更喜欢使用其他答案中提到的其他Cocoa选项之一。