2011-12-22 9 views
28

Así que si usted tiene una NSString que dice:reemplazar sólo la primera instancia de una subcadena en una NSString

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

me gustaría un método que reemplaza sólo la primera instancia de azul con verde, para producir:

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

¿Cómo se hace esto?

+1

Por qué el voto hacia abajo? –

Respuesta

54

Suponiendo las siguientes entradas:

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

El algoritmo es bastante simple:

NSRange rOriginal = [myString rangeOfString:original]; 

if (NSNotFound != rOriginal.location) { 
    myString = [myString stringByReplacingCharactersInRange:rOriginal withString:replacement]; 
} 
+23

Otra pasada con 'original = @" luego "' 'replacement = @" que "' también podría ser aconsejable. –

+3

No es mi problema si la cadena original tiene errores ortográficos. ; p –

+0

@lulius Caesar Acaba de arreglar el error de gramática. –

3
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); 
+2

Esto fallará con una excepción si 'initialString' no contiene' @ "azul" '. –

+1

Buen punto, gracias. – Eugene

0

Primero localice la subcadena, y luego hacer la sustitución. Ejemplo:

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

NSString documentación.

+0

El uso de 'stringByReplacingOccurrencesOfString:' no es necesario aquí, porque en 'firstFooRange' es una sola ocurrencia. Use 'stringByReplacingCharactersInRange:' en su lugar. – AppsolutEinfach

0
-(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; 
} 
8

En Swift es útil extiende cadena de esta manera:

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 
    } 

} 

De esta manera se puede llamar a cualquier lugar:

let s = "The red red cat".stringByReplacingFirstOccurrenceOfString("red", withString: "fat") 
print(s) // "The fat red cat" 
8

SWIFT 3 ACTUALIZACIÓN:

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 
    } 
} 
2

Swift 4 Versión:

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) 
} 
Cuestiones relacionadas