我试着写,将搜索一个NSString,确定该字符串中的个别字是超过6个字符,并与其他一些字(任意东西像“你好”)替换单词的方法。
我开始搭配长款,我需要有一个NSString的对象,其格式与间距并没有受到影响查找和替换就结了。
我试着写,将搜索一个NSString,确定该字符串中的个别字是超过6个字符,并与其他一些字(任意东西像“你好”)替换单词的方法。
我开始搭配长款,我需要有一个NSString的对象,其格式与间距并没有受到影响查找和替换就结了。
有一对夫妇与使用简单的解决方案微妙的问题componentsSeparatedByString:
假设一个替代词“ - ”像串...
“从本质上讲,” DHC的结论,
“bokanovskification由一系列的发展逮捕的。”
...会导致...
- DHC的 - - 的 - 一系列的 -
......而正确的输出将是:
“ - ”的DHC - ,
“ - 的 - - 一系列的 - 。”
幸运的是有一个在可可一个更好的,但简单的解决方案: -[NSString enumerateSubstringsInRange:options:usingBlock:]
它提供了通过定义子快速迭代options
的说法。 一种可能性是NSStringEnumerationByWords
其中列举了实际上是真实的话(在当前区域)的所有子。 它甚至检测不使用分隔符(空格)分开的话,日语等语言单个单词。
这里有一个简单的演示项目上的行话文件(1.6 MB,237,239字)的作品。 它比较三种不同的解决方案:
它的核心是置换循环:
NSMutableString *result = [NSMutableString stringWithCapacity:[originalString length]];
__block NSUInteger location = 0;
[originalString enumerateSubstringsInRange:(NSRange){0, [originalString length]}
options:NSStringEnumerationByWords | NSStringEnumerationLocalized | NSStringEnumerationSubstringNotRequired
usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
if (substringRange.length > maxChar) {
NSString *charactersBetweenLongWords = [originalString substringWithRange:(NSRange){ location, substringRange.location - location }];
[result appendString:charactersBetweenLongWords];
[result appendString:replaceWord];
location = substringRange.location + substringRange.length;
}
}];
[result appendString:[originalString substringFromIndex:location]];
正如指出Monolo所提出的代码使用NSString
的长度来确定一个字的字符的数目。 这是一个值得商榷的做法,至少可以这样说。 其实一个字符串的length
指定使用的字符串,常常是什么人将承担的字符数推迟值编码代码片段的数量。
由于“性格”一词在各种情况下不同的含义和OP没有指定要使用我刚刚离开的代码,因为它是哪种类型的字符计数。 如果你想有一个不同的计数,请参阅该讨论话题的文档:
你可以从答案看,有几种方法来完成你所追求的,但我个人更喜欢使用NSString
类的stringByReplacingOccurrencesOfString:withString:options:range:
方法,它是由正好与另一个字符串替换子。
在你的情况下,我们需要使用NSRegularExpressionSearch
选项,这将允许识别与7个或更多字母(即超过6个字母,你说出它)字样。
如果你使用\w
*人物表情,你会自动获得Unicode支持,所以尽可能多的语言适用于苹果(实际上,ICU)支持。
它是这样的:
NSString *stringWithLongWords = @"There are some words of extended length in this text. One of them is Escher's. They will be identified with a regular expression and changed for some arbitrary word.";
NSString *overSixCharsPattern = @"(?w)\\b[\\w]{7,}\\b";
NSString *replacementString = @"hello";
NSString *result = [stringWithLongWords stringByReplacingOccurrencesOfString: overSixCharsPattern
withString: replacementString
options: NSRegularExpressionSearch
range: NSMakeRange(0, stringWithLongWords.length)];
所述\b
表达式表示一个字边界,这确保了整个单词被匹配和取代。 该w
修改使得\b
使用字边界更自然的定义。 具体来说,它处理字符串“埃舍尔的”,由@NikolaiRuhe提到的例子。 文档在这里 ,与边界检测的具体讨论在这里 。
还要注意的是文字NSString
(即,一个在你的Objective-C源文件中直接输入),需要在源代码中两个反斜杠产生一个所产生的字符串中。
还有就是在了解更多信息的NSString文档
*技术上\w
字字符,其中还包括在正则表达式通过使用的定义的数字相匹配。
试试这个。
NSString *str = @"Do any additional setup after loading the view, typically from a nib.";
NSMutableArray *array = [[str componentsSeparatedByString:@" "] mutableCopy];
for (int i = 0; i < [array count]; i++) {
NSString *str_ = [array objectAtIndex:i];
if ([str_ length] > 6)
[array replaceObjectAtIndex:i withObject:@"Hello"];
}
然后再加入他们
str = [array componentsJoinedByString:@" "];