Заменить несколько символов в строке в Objective-C?
В PHP я могу это сделать:
$new = str_replace(array('/', ':', '.'), '', $new);
... заменить все экземпляры символов /:. с пустой строкой (чтобы удалить их)
Могу ли я сделать это легко в Objective-C? Или мне нужно катиться самостоятельно?
В настоящее время я выполняю несколько вызовов stringByReplacingOccurrencesOfString
:
strNew = [strNew stringByReplacingOccurrencesOfString:@"/" withString:@""];
strNew = [strNew stringByReplacingOccurrencesOfString:@":" withString:@""];
strNew = [strNew stringByReplacingOccurrencesOfString:@"." withString:@""];
Спасибо,
матовая
Ответы
Ответ 1
Несколько неэффективный способ сделать это:
NSString *s = @"foo/bar:baz.foo";
NSCharacterSet *doNotWant = [NSCharacterSet characterSetWithCharactersInString:@"/:."];
s = [[s componentsSeparatedByCharactersInSet: doNotWant] componentsJoinedByString: @""];
NSLog(@"%@", s); // => foobarbazfoo
Посмотрите NSScanner
и -[NSString rangeOfCharacterFromSet: ...]
, если вы хотите сделать это более эффективно.
Ответ 2
Есть ситуации, когда ваш метод достаточно хорош, я думаю, матовый. Кстати, я думаю, что лучше использовать
[strNew setString: [strNew stringByReplacingOccurrencesOfString:@":" withString:@""]];
а не
strNew = [strNew stringByReplacingOccurrencesOfString:@"/" withString:@""];
поскольку я думаю, что вы перезаписываете указатель NSMutableString с помощью NSString, который может вызвать утечку памяти.
Ответ 3
По сути то же самое, что и Николас, выше, но если вы хотите удалить все, ИСКЛЮЧИТЕ набор символов (скажем, вы хотите удалить все, что не находится в наборе "ABCabc123" ), вы можете сделать следующее:
NSString *s = @"A567B$%C^.123456abcdefg";
NSCharacterSet *doNotWant = [[NSCharacterSet characterSetWithCharactersInString:@"ABCabc123"] invertedSet];
s = [[s componentsSeparatedByCharactersInSet: doNotWant] componentsJoinedByString: @""];
NSLog(@"%@", s); // => ABC123abc
Полезно для удаления символов и т.д., если вам нужно только буквенно-цифровое.
Ответ 4
Пришлось сделать это недавно и захотело использовать эффективный метод:
(предполагается, что someText является атрибутом NSString или text)
NSString* someText = @"1232342jfahadfskdasfkjvas12!";
(в этом примере будут разбиты строки из строки)
[someText stringByReplacingOccurrencesOfString:@"[^0-9]" withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, [someText length])];
Имейте в виду, что вам нужно избежать символа регулярного выражения с использованием символа escape-функции Obj-c:
(obj-c использует двойную обратную косую черту, чтобы избежать специальных регулярных выражений)
...stringByReplacingOccurrencesOfString:@"[\\\!\\.:\\/]"
Что делает интересным то, что опция NSRegularExpressionSearch мало используется, но может привести к некоторым очень мощным элементам управления:
Вы можете найти учебник по регулярному выражению iOS здесь и более подробно о регулярных выражениях на regex101.com
Ответ 5
+ (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;
}
Ответ 6
Если символы, которые вы хотите удалить, должны быть смежными друг с другом, вы можете использовать
stringByReplacingCharactersInRange:(NSRange) withString:(NSString *)
Кроме того, я думаю, что использование одной и той же функции несколько раз не так уж плохо. Это гораздо более читаемо, чем создание большого метода для того, чтобы сделать то же самое более общим образом.
Ответ 7
Вот пример в Swift 3 с использованием опции регулярного выражения для заменыСохранения.
Используйте replaceOccurrences вместе с опцией 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
Ответ 8
Создайте расширение на String...
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:"")