在Objective-C中replacestring中的多个字符?
在PHP中,我可以这样做:
$new = str_replace(array('/', ':', '.'), '', $new);
…replace字符/的所有实例。 用一个空白string(删除它们)
我可以在Objective-C中轻松做到这一点吗? 或者我必须推出自己的?
目前我正在对stringByReplacingOccurrencesOfString
进行多次调用:
strNew = [strNew stringByReplacingOccurrencesOfString:@"/" withString:@""]; strNew = [strNew stringByReplacingOccurrencesOfString:@":" withString:@""]; strNew = [strNew stringByReplacingOccurrencesOfString:@"." withString:@""];
谢谢,
亚光
这样做有点低效:
NSString *s = @"foo/bar:baz.foo"; NSCharacterSet *doNotWant = [NSCharacterSet characterSetWithCharactersInString:@"/:."]; s = [[s componentsSeparatedByCharactersInSet: doNotWant] componentsJoinedByString: @""]; NSLog(@"%@", s); // => foobarbazfoo
看看NSScanner
和-[NSString rangeOfCharacterFromSet: ...]
如果你想更有效地做到这一点。
有些情况下,你的方法足够好,我认为马特..顺便说一句,我认为这是更好的使用
[strNew setString: [strNew stringByReplacingOccurrencesOfString:@":" withString:@""]];
而不是
strNew = [strNew stringByReplacingOccurrencesOfString:@"/" withString:@""];
因为我认为你用NSString覆盖NSMutableString指针可能导致内存泄漏。
Nicholas基本上和上面一样,但是如果你想删除除了一组字符之外的所有东西(比如说你想删除不在“ABCabc123”集合中的所有东西),那么你可以这样做:
NSString *s = @"A567B$%C^.123456abcdefg"; NSCharacterSet *doNotWant = [[NSCharacterSet characterSetWithCharactersInString:@"ABCabc123"] invertedSet]; s = [[s componentsSeparatedByCharactersInSet: doNotWant] componentsJoinedByString: @""]; NSLog(@"%@", s); // => ABC123abc
如果你只想要字母数字,那么在剥离符号等方面很有用。
最近不得不这样做,想分享一个有效的方法:
(假设someText是一个NSString或文本属性)
NSString* someText = @"1232342jfahadfskdasfkjvas12!";
(这个例子会从string中去掉数字)
[someText stringByReplacingOccurrencesOfString:@"[^0-9]" withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, [someText length])];
请记住,您将需要使用Obj-c转义字符转义正则expression式字符:
(obj-c使用双反斜杠来转义特殊的正则expression式文字)
...stringByReplacingOccurrencesOfString:@"[\\\!\\.:\\/]"
是什么让这个有趣的是,NSRegularExpressionSearch选项很less使用,但可以导致一些非常强大的控制:
你可以在这里find一个很好的iOS正则expression式教程,以及regex101.com上正则expression式的更多内容
+ (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 ie, 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; }
如果你想删除的字符是相邻的,你可以使用
stringByReplacingCharactersInRange:(NSRange) withString:(NSString *)
除此之外,我认为多次使用相同的function并不是那么糟糕。 这比创build一个更通用的方法来做更大的方法更可读。
这是Swift 3中使用replaceOccurances的regularExpression选项的一个例子。
使用replacementOccurrences和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
在String上创build一个扩展…
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:"")