在Objective-C中如何替换字符串中的多个字符?

48

在 PHP 中我可以这样做:

$new = str_replace(array('/', ':', '.'), '', $new);

如何用 Objective-C 将所有包含 / : . 这些字符的地方替换成空(以删除它们)?

我能否在 Objective-C 中轻松实现这一点?还是必须自己编写代码?

目前我正在使用多个 stringByReplacingOccurrencesOfString 调用:

strNew = [strNew stringByReplacingOccurrencesOfString:@"/" withString:@""];
strNew = [strNew stringByReplacingOccurrencesOfString:@":" withString:@""];
strNew = [strNew stringByReplacingOccurrencesOfString:@"." withString:@""];

谢谢,
马特

8个回答

122
这是一种有些低效的做法:
NSString *s = @"foo/bar:baz.foo";
NSCharacterSet *doNotWant = [NSCharacterSet characterSetWithCharactersInString:@"/:."];
s = [[s componentsSeparatedByCharactersInSet: doNotWant] componentsJoinedByString: @""];
NSLog(@"%@", s); // => foobarbazfoo

如果您想更高效地实现这一点,可以查看 NSScanner-[NSString rangeOfCharacterFromSet: ...]


27

有时候你的方法已经足够好了,我认为Matt..顺便说一句,我觉得最好使用

[strNew setString: [strNew stringByReplacingOccurrencesOfString:@":" withString:@""]];

而不是

strNew = [strNew stringByReplacingOccurrencesOfString:@"/" withString:@""];

我认为你正在用一个NSString覆盖NSMutableString指针,这可能会导致内存泄漏。


NSString不会响应setString。 - fulvio
2
假设strNew是一个NSMutableString,那么这样做是正确的。但是如果你要使用NSMutableString,那么最好使用[strNew replaceOccurrencesOfString:@":" withString:@"" options:0 range:NSMakeRange(0, [strNew length])] - user102008

9

最近我需要做这件事情,想和大家分享一种高效的方法:

(假设someText是一个NSString或文本属性)

NSString* someText = @"1232342jfahadfskdasfkjvas12!";

(这个示例将从字符串中删除数字)
[someText stringByReplacingOccurrencesOfString:@"[^0-9]" withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, [someText length])];

请记住,您需要使用Obj-c转义字符转义正则表达式字面值字符:

(obj-c使用双反斜杠来转义特殊的正则表达式字面值)

...stringByReplacingOccurrencesOfString:@"[\\\!\\.:\\/]" 

有趣的是,NSRegularExpressionSearch选项虽然使用较少,但可以带来非常强大的控制:

您可以在这里找到一个不错的iOS正则表达式教程,以及更多关于正则表达式的内容可以在regex101.com上找到。


7

基本上与尼古拉斯上面发布的相同,但如果您想要删除除字符集(比如说您要删除除了“ABCabc123”之外的所有内容)以外的所有内容,那么可以执行以下操作:

NSString *s = @"A567B$%C^.123456abcdefg";
NSCharacterSet *doNotWant = [[NSCharacterSet characterSetWithCharactersInString:@"ABCabc123"] invertedSet];
s = [[s componentsSeparatedByCharactersInSet: doNotWant] componentsJoinedByString: @""];
NSLog(@"%@", s); // => ABC123abc

如果您只需要字母数字,那么这将非常有用,可以去除符号等内容。


2
+ (NSString*) decodeHtmlUnicodeCharactersToString:(NSString*)str
{
    NSMutableString* string = [[NSMutableString alloc] initWithString:str];  // #&39; replace with '
    NSString* unicodeStr = nil;
    NSString* replaceStr = nil;
    int counter = -1;

    for(int i = 0; i < [string length]; ++i)
    {
        unichar char1 = [string characterAtIndex:i]; 
        for (int k = i + 1; k < [string length] - 1; ++k)
        {
            unichar char2 = [string characterAtIndex:k]; 

            if (char1 == '&'  && char2 == '#' ) 
            { 
                ++counter;
                unicodeStr = [string substringWithRange:NSMakeRange(i + 2 , 2)]; // read integer value i.e, 39
                replaceStr = [string substringWithRange:NSMakeRange (i, 5)];  // #&39;
                [string replaceCharactersInRange: [string rangeOfString:replaceStr] withString:[NSString stringWithFormat:@"%c",[unicodeStr intValue]]];
                break;
            }
        }
    }

    [string autorelease];

    if (counter > 1)
        return [self decodeHtmlUnicodeCharactersToString:string]; 
    else
        return string;
}

2

下面是一个使用Swift 3中的replacingOccurrences函数和regularExpression选项的示例:

使用 replacingOccurrences 函数,并加上 String.CompareOptions.regularExpression 选项。

示例(Swift 3):

var x = "<Hello, [play^ground+]>"
let y = x.replacingOccurrences(of: "[\\[\\]^+<>]", with: "7", options: .regularExpression, range: nil)
print(y)

输出:

7Hello, 7play7ground777

1
在字符串上创建一个扩展...
extension String {

   func replacingOccurrences(of strings:[String], with replacement:String) -> String {
      var newString = self
      for string in strings {
          newString = newString.replacingOccurrences(of: string, with: replacement)
      }
      return newString
   }

}

像这样调用它:
aString = aString.replacingOccurrences(of:['/', ':', '.'], with:"")

1
如果您想要删除的字符相邻,您可以使用
stringByReplacingCharactersInRange:(NSRange) withString:(NSString *)

除此之外,我认为只是多次使用相同的函数并不那么糟糕。这比创建一个更通用的大方法来完成相同的任务要可读得多。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接