2011-10-04 15 views
9

Estoy tratando de reemplazar todos los caracteres excepto los últimos 4 en una cadena con *.
En objetivo-c hay un método en NSString clase replaceStringWithCharactersInRange: withString: donde le daría rango (0,[string length]-4)) con la cadena @"*". Esto es lo que hace: 123456789ABCD se modifica a * ABCD mientras estoy buscando hacer ******** ABCD. Entiendo que reemplazó el rango que especifiqué con el objeto de cadena. ¿Cómo lograr esto?Reemplazar caracteres en NSString

Respuesta

12
NSError *error; 

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\d" options:NSRegularExpressionCaseInsensitive error:&error]; 

NSString *newString = [regex stringByReplacingMatchesInString:string options:0 range:NSMakeRange(0, [string length]) withTemplate:@"*"]; 
+0

no funciona, la cadena es reemplazado por – ARC

+0

* Trate '@ "\ d +"' 'como su regularExpressionWithPattern:' argumento. Intenté '\\ d +' en [este probador de expresiones regulares] (http://regexpal.com/), y falló, pero '\ d +' funcionó. –

+0

Solucionado. Simplemente reemplace \\ d + con \\ d en el patrón. Solo recuerde que las expresiones regulares requieren iOS 4 o posterior. Si necesita que funcione en iOS 3, debería usar NSScanner – Lefteris

0

Puede usar [theString substringToIndex:[theString length]-4] para obtener la primera parte de la cadena y luego combinar [la longitud del String] -4 * con la segunda parte. Tal vez su es una manera más fácil de hacer esto ..

-1
NSMutableString * str1 = [[NSMutableString alloc]initWithString:@"1234567890ABCD"]; 
[str1 replaceCharactersInRange:NSMakeRange(0, [str1 length] - 4) withString:@"*"]; 
NSLog(@"%@",str1); 

funciona

+0

¿Leíste mi pregunta o la respuesta de mi pregunta?downvoted por mí – ARC

+0

Lo siento, no entiendo la pregunta correctamente – Vitaliy

+0

NSMutableString * str1 = [[NSMutableString alloc] initWithString: @ "1234567890ABCD"]; NSRange replacementRange = NSMakeRange (0, [str1 length] - 4); NSMutableString * replacementString = [[NSMutableString alloc] init]; para (uint i = 0; i Vitaliy

1

Esto parece un problema sencillo ... obtener la primera secuencia parcial y devolverlo con los cuatro últimos caracteres adjuntas lo.
Aquí es una función que devuelve la cadena necesaria:

-(NSString *)neededStringWithString:(NSString *)aString { 
    // if the string has less than or 4 characters, return nil 
    if([aString length] <= 4) { 
     return nil; 
    } 
    NSUInteger countOfCharToReplace = [aString length] - 4; 
    NSString *firstPart = @"*"; 
    while(--countOfCharToReplace) { 
     firstPart = [firstPart stringByAppendingString:@"*"]; 
    } 
    // range for the last four 
    NSRange lastFourRange = NSMakeRange([aString length] - 4, 4); 
    // return the combined string 
    return [firstPart stringByAppendingString: 
      [aString substringWithRange:lastFourRange]]; 
} 
1

La parte más intuitivo en el cacao es la creación de las estrellas que se repiten sin algún tipo de bucle incómoda. stringByPaddingToLength:withString:startingAtIndex: le permite crear una cadena de repetición de cualquier longitud que desee, por lo que una vez que tenga que, he aquí una solución sencilla:

NSInteger starUpTo = [string length] - 4; 
if (starUpTo > 0) { 
    NSString *stars = [@"" stringByPaddingToLength:starUpTo withString:@"*" startingAtIndex:0]; 
    return [string stringByReplacingCharactersInRange:NSMakeRange(0, starUpTo) withString:stars]; 
} else { 
    return string; 
} 
-1

La expresión regular no funcionaba en iOS7, pero tal vez esto ayuda:

- (NSString *)encryptString:(NSString *)pass { 

    NSMutableString *secret = [NSMutableString new]; 

    for (int i=0; i<[pass length]; i++) { 
     [secret appendString:@"*"]; 
    } 

    return secret; 
} 

En su caso, debe dejar de reemplazar los últimos 4 caracteres. Poco crudo, pero hace el trabajo

+0

Todo esto devuelve una cadena que está * 'd out. ¿Cómo responde esto la pregunta? (¿Saliendo de los últimos 4?) –

+0

De hecho, Hmm no leyó lo suficiente. for (int i = 0; i <[longitud de paso] - 4; i ++) { [secret appendString: @ "*"]; } luego use nsmakerange para copiar los últimos 4 caracteres. Pero una mejor respuesta ya está ahí – CocoaChris

0

No estoy seguro de por qué se aceptó la respuesta aceptada, ya que solo funciona si todo menos el último 4 es un dígito. Aquí está una manera simple:

NSMutableString * str1 = [[NSMutableString alloc]initWithString:@"1234567890ABCD"]; 
NSRange r = NSMakeRange(0, [str1 length] - 4); 
[str1 replaceCharactersInRange:r withString:[[NSString string] stringByPaddingToLength:r.length withString:@"*" startingAtIndex:0]]; 
NSLog(@"%@",str1); 
Cuestiones relacionadas