创建一个 set/array 的 NSString 以与 stringByReplacingOccurrencesOfString 一起使用

Create a set/array of NSString's to use with stringByReplacingOccurrencesOfString

我想用特定的字符串替换 NSString 中的某些相似词。例如:

stringToChange = [stringToChange stringByReplacingOccurrencesOfString:@"Hello" withString:@"Top o' de marnin ter yer"];
stringToChange = [stringToChange stringByReplacingOccurrencesOfString:@"hello" withString:@"Top o' de marnin ter yer"];
stringToChange = [stringToChange stringByReplacingOccurrencesOfString:@"Hey" withString:@"Top o' de marnin ter yer"];
stringToChange = [stringToChange stringByReplacingOccurrencesOfString:@"hey" withString:@"Top o' de marnin ter yer"];
stringToChange = [stringToChange stringByReplacingOccurrencesOfString:@"Hi" withString:@"Top o' de marnin ter yer"];
stringToChange = [stringToChange stringByReplacingOccurrencesOfString:@"hi" withString:@"Top o' de marnin ter yer"];

显然,这不是很有效,而且我很难想出解决方案。

是否可以将这些 NSString 放入数组或某种字符串集中,这样生成的代码看起来更像:

stringToChange = [stringToChange stringByReplacingOccurrencesOfString:arrayOfStrings withString:@"Top o' de marnin ter yer"];

其中 arrayOfStrings 将包含 @"Hello", @"hello", @"Hey", @"hey", @"Hi", @"hi"

您当然可以将搜索字符串放入一个集合中,遍历该集合,然后对循环的每一步进行搜索和替换。但这也是搜索列表中每个项目的字符串循环。

相反,您应该使用 NSScanner,在找到匹配项时遍历字符串。对于较长的源字符串,您会发现此 far 在时间和 space 上都更有效率。使用 stringByReplacingOccurrencesOfString:withString: 每次都会创建一个新字符串;您当然可以通过先转换为 NSMutableString 并使用 replaceOccurrencesOfString:withString:options:range:

来改善这一点

扫描仪的使用方法如下:

NSScanner * scanner = [NSScanner scannerWithString:source];
NSMutableString * fixedUpString = [NSMutableString string];

NSArray * searchStrings = @[/* The items you want to remove */];
NSString * replacementString = /* The new material */;

while( ![scanner isAtEnd] ){

    // Moving through the string, try each search in turn
    for( NSString * searchString in searchStrings ){

        // If there's a match, save what's been scanned up to that point
        NSString * scanned;
        if( [scanner scanUpToString:searchString intoString:&scanned] ){

            [fixedUpString appendString:scanned];
            // and add the new material
            [fixedUpString appendString:replacementString];
            // Move past the searched piece and continue
            [scanner scanString:searchString intoString:NULL];
        }
    }
}

fixedUpString 现在包含原始字符串中的所有内容,替换了您的目标短语。