Заменить только первый экземпляр подстроки в NSString - PullRequest
34 голосов
/ 22 декабря 2011

Итак, если у вас есть строка NSString:

@"My blue car is bigger than my blue shoes or my blue bicycle";

Мне бы хотелось, чтобы метод, который заменял только первый экземпляр синего на зеленый, выдает:

@"My green car is bigger than my blue shoes or my blue bicycle";

Какодин делает это?

Ответы [ 7 ]

60 голосов
/ 22 декабря 2011

Предполагая следующие входные данные:

NSString *myString = @"My blue car is bigger then my blue shoes or my blue bicycle";
NSString *original = @"blue";
NSString *replacement = @"green";

Алгоритм довольно прост:

NSRange rOriginal = [myString rangeOfString:original];

if (NSNotFound != rOriginal.location) {
    myString = [myString stringByReplacingCharactersInRange:rOriginal withString:replacement];
}
13 голосов
/ 29 ноября 2016

ОБНОВЛЕНИЕ SWIFT 3 и 4:

extension String 
{
    func stringByReplacingFirstOccurrenceOfString(
            target: String, withString replaceString: String) -> String
    {
        if let range = self.range(of: target) {
            return self.replacingCharacters(in: range, with: replaceString)
        }
        return self
    } 
}
9 голосов
/ 20 ноября 2015

В Swift полезно расширить String таким образом:

public extension String {

    func stringByReplacingFirstOccurrenceOfString(target: String, withString replaceString: String) -> String {
        if let range = self.rangeOfString(target) {
            return self.stringByReplacingCharactersInRange(range, withString: replaceString)
        }
        return self
    }

}

Таким образом, вы можете звонить куда угодно:

let s = "The red red cat".stringByReplacingFirstOccurrenceOfString("red", withString: "fat")
print(s) // "The fat red cat"
7 голосов
/ 18 октября 2017

Swift 4 версия:

func replacingFirstOccurrence(of string: String, with replacement: String) -> String {
    guard let range = self.range(of: string) else { return self }
    return replacingCharacters(in: range, with: replacement)
}
3 голосов
/ 22 декабря 2011
  NSString *initialString = @"My blue car is bigger then my blue shoes or my blue bicycle";
  NSRange range = [initialString rangeOfString:@"blue"];
  NSString *replacedString = [initialString stringByReplacingCharactersInRange:range withString:@"green"];
  NSLog(@"replacedString: %@", replacedString);
0 голосов
/ 06 августа 2014
-(NSString*) replaceFirstOccuarnceFromString: (NSString*)input withOriginal:(NSString*) original AndReplacment:(NSString*)replacement
{
    NSRange rOriginal = [input rangeOfString: original];
    if (NSNotFound != rOriginal.location) {
        input = [input
                    stringByReplacingCharactersInRange: rOriginal
                    withString:                         replacement];
    }
    return input;
}
0 голосов
/ 22 декабря 2011

Сначала найдите подстроку, а затем сделайте замену.Пример:

NSString *aString = @"foo bar foo";
NSRange firstFooRange = [aString rangeOfString:@"foo"];
NSString *anotherString = [aString stringByReplacingOccurrencesOfString:@"foo"
                                                             withString:@"bar"
                                                                options:0
                                                                  range:firstFooRange];

NSString документация.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...