【问题标题】:Is there an Objective-C (NSString) Equivalent of Java's replaceAll("\\p{Cntrl}", "")?是否有 Java 的 replaceAll("\\p{Cntrl}", "") 的 Objective-C (NSString) 等效项?
【发布时间】:2023-04-03 18:26:01
【问题描述】:

很简单的问题:

iOS 开发人员可以使用 NSString 对象来执行与 Java 对 String 的 replaceAll("\p{Cntrl}", "") 调用相同的操作的 Objective-C 等价物吗?

我们在 Java 中已经有了这个:

String noControlCharsString = maybeHasControlCharsString.replaceAll("\\p{Cntrl}", "");

我也想要在 Objective-C 中这样的东西:

NSString *noControlCharsString = [maybeHasControlCharsString stringByReplacingControlCharsWithString:@""];

提前致谢。

AG3

【问题讨论】:

    标签: java objective-c nsstring replaceall control-characters


    【解决方案1】:

    尝试使用这个.. 这是用来替换字符的。

      NSString *str = @"\\p{Cntrl}AB/bar:baz\\p{Cntrl}foo";
        NSCharacterSet *doNotWant = [NSCharacterSet characterSetWithCharactersInString:@"\\p{Cntrl}"];
        str = [[str componentsSeparatedByCharactersInSet: doNotWant] componentsJoinedByString: @""];
        NSLog(@"%@", str);
    

    其他方面 这用于替换整个字符串。

       NSString *str = @"\\p{Cntrl} This is a string \\p{Cntrl}";
    
        str = [str stringByReplacingOccurrencesOfString:@"\\p{Cntrl}"
                                                 withString:@""];
    
            NSLog(@"%@", str);
    

    【讨论】:

    • 谢谢,但是 Java 中使用的 "\\p{Cntrl}" 是一个正则表达式,它实际上专门匹配可能出现在字符串中的所有控制字符——而不仅仅是构成该特殊字符的实际文本字母顺序。我正在寻找一种可以删除所有这些控制字符的解决方案。
    • 您要一个一个字符或整个字符串替换什么?。
    【解决方案2】:

    NSStringstringByReplacingOccurrencesOfString 方法有一个 NSRegularExpressionSearch 选项接受与您的相同模式 \p{Cntrl} Java方法:

    NSString *maybeHasControlCharsString = @"\nabc\r\ndef\r";
    NSString *noControlCharsString =
        [maybeHasControlCharsString stringByReplacingOccurrencesOfString:@"\\p{Cntrl}"
                                           withString:@""
                                              options:NSRegularExpressionSearch
                                                range:NSMakeRange(0, [maybeHasControlCharsString length])];
    NSLog(@"%@", noControlCharsString);
    // Output: abcdef
    

    【讨论】:

      【解决方案3】:

      试试:

      NSString *noControlCharsString = [maybeHasControlCharsString stringByTrimmingCharactersInSet:controlCharacterSet];
      

      编辑 正如 Martin R 所说,上述内容仅删除了任何前导或尾随匹配项。

      这是一个从字符串中删除所有匹配项的类别方法:

      - (NSString *)stringByStrippingCharactersInSet:(NSCharacterSet *)set {
          NSString *r = [self stringByTrimmingCharactersInSet:set];
          NSArray *components = [r componentsSeparatedByCharactersInSet:set];
          components = [components filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"self <> ''"]];
          return [components componentsJoinedByString:@""];
      }
      

      【讨论】:

      • stringByTrimmingCharactersInSet 仅删除 前导尾随 字符,因此 "\nA\nB\n" 将变为 "A\nB"。中间的控制字符不会被替换。
      • 谢谢马丁。是的,我的第一个贡献是错误的:(
      • 欢迎来到 SO!您的新代码看起来正确,您甚至可以删除对stringByTrimmingCharactersInSet 的调用。 - (我必须承认我不喜欢使用componentsSeparatedByCharactersInSet 过滤字符串,因为它会创建很多临时对象。)
      • 其实filteredArrayUsingPredicate调用也不是必须的。
      猜你喜欢
      • 1970-01-01
      • 2010-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多