如何将特定字符添加到 NSString 中的一组字符

How to add a specific character to a set of characters in a NSString

我想在 NSString 中的一组字符前面添加一个特定的字符。

例如:

NSString *input = @"abc^ 123 # //> <";    
NSString *insertBefore = @"~";
NSCharacterSet *needBeInserted = [NSCharacterSet 
                        characterSetWithCharactersInString:@"~#^/<>"];

预期结果:needBeInserted中出现在input中的任何字符将添加insertBefore

result = @"abc~^ 123 ~# ~/~/~> ~<";

有什么优雅的方法吗?而不是使用多行 stringByReplacingOccurrencesOfString?

您必须搜索字符并替换它:

NSRange searchRange = NSMakeRange( 0,[input length] );
NSRange charRange;
while( (charRange = [input rangeOfCharactersFromSet:escapeSet options:NSBackwardSearch).length range:searchRange)
{
  // It is allowed to have a 0-length range: Insertion
  input = [input stringByReplacingCharactersInRange:NSMakeRange(charRange.location, 0) withString:@"\"];

  // Shorten the search range
  searchRange = NSMakeRange(0, charRange.location);
}

用 Safari 编写。您应该测试是否存在边缘情况和拼写错误。

另一种方法是从字符集中创建一个(单字母)字符串数组,并用转义字符的组合替换它的出现。对我来说似乎更复杂,更不自然。

您可以将字符放入 character class 并使用基于正则表达式的替换:

[~#^/<>]

替换为 ~[=12=],其中 [=13=] 将整个匹配文本插入到结果字符串中。见 regex demo.

参见 Objective-C demo online:

NSError *error = nil;
NSString *input = @"abc^ 123 # //> <";
NSString *pat = @"[~#^/<>]";
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pat options:nil error:&error];
NSString *modifiedString = [regex stringByReplacingMatchesInString:input 
        options:0 
        range:NSMakeRange(0, [input length]) 
        withTemplate:@"~[=11=]"];
NSLog(@"%@", modifiedString);

结果:abc~^ 123 ~# ~/~/~> ~<