【问题标题】:How to add a specific character to a set of characters in a NSString如何将特定字符添加到 NSString 中的一组字符中
【发布时间】:2018-03-29 11:55:54
【问题描述】:

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

例如:

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

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

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

有没有优雅的方法来做到这一点?而不是使用多行stringByReplacingOccurrencesOfString?

【问题讨论】:

  • 很遗憾,一些字符如:&lt;&gt; 不包括在内。
  • 但它们在正则表达式中并不特殊,它们不必被转义。请在问题中定义您的确切要求(您需要转义哪些字符?)。
  • 这就是为什么我创建一个NSCharacterSet 来存储在我的情况下需要转义的字符。快速解决方案是通过NSCharacterSet 并为集合中的每个字符调用stringByReplacingOccurrencesOfString。只是想知道是否有更好的解决方案:)
  • 请在问题中添加确切的要求。

标签: objective-c nsstring nsregularexpression


【解决方案1】:

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

[~#^/<>]

替换为~$0,其中$0 将整个匹配文本插入到结果字符串中。请参阅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:@"~$0"];
NSLog(@"%@", modifiedString);

结果:abc~^ 123 ~# ~/~/~&gt; ~&lt;

【讨论】:

    【解决方案2】:

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

    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 中编写。您应该测试是否有边缘情况和拼写错误。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-27
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多