查找和一个NSString取代长的话吗? [关闭](Find and replace long

2019-09-02 08:38发布

我试着写,将搜索一个NSString,确定该字符串中的个别字是超过6个字符,并与其他一些字(任意东西像“你好”)替换单词的方法。

我开始搭配长款,我需要有一个NSString的对象,其格式与间距并没有受到影响查找和替换就结了。

Answer 1:

为什么其他的答案吗?

有一对夫妇与使用简单的解决方案微妙的问题componentsSeparatedByString:

  1. 标点符号不作为单词分隔符处理。
  2. 其他空白的空格字符(换行符,制表)仅仅是被丢弃。
  3. 在长串了很多浪费内存。
  4. 它很慢。

假设一个替代词“ - ”像串...

“从本质上讲,” DHC的结论,
“bokanovskification由一系列的发展逮捕的。”

...会导致...

- DHC的 - - 的 - 一系列的 -

......而正确的输出将是:

“ - ”的DHC - ,
“ - 的 - - 一系列的 - 。”

幸运的是有一个在可可一个更好的,但简单的解决方案: -[NSString enumerateSubstringsInRange:options:usingBlock:]

它提供了通过定义子快速迭代options的说法。 一种可能性是NSStringEnumerationByWords其中列举了实际上是真实的话(在当前区域)的所有子。 它甚至检测不使用分隔符(空格)分开的话,日语等语言单个单词。

比较解决方案

这里有一个简单的演示项目上的行话文件(1.6 MB,237,239字)的作品。 它比较三种不同的解决方案:

  1. componentsSeparatedByString:270毫秒
  2. enumerateSubstringsInRange:125毫秒
  3. stringByReplacingOccurrencesOfString,如通过@Monolo描述:200毫秒

履行

它的核心是置换循环:

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没有指定要使用我刚刚离开的代码,因为它是哪种类型的字符计数。 如果你想有一个不同的计数,请参阅该讨论话题的文档:

  • 苹果的字符串编程指南, 字符和字形集群
  • Unicode的常见问题: 如何测量字符在字符串中字符的长度或位置时计数?


Answer 2:

你可以从答案看,有几种方法来完成你所追求的,但我个人更喜欢使用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字字符,其中还包括在正则表达式通过使用的定义的数字相匹配。



Answer 3:

试试这个。

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:@" "];


文章来源: Find and replace long words in an NSString? [closed]