Замена символов в NSString

#objective-c #ios #xcode #macos

#objective-c #iOS #xcode #macos

Вопрос:

Я пытаюсь заменить все символы, кроме последних 4 в строке, на *’s .
В objective-c есть метод в классе NSString replaceStringWithCharactersInRange: withString: , где я бы дал ему диапазон (0,[string length]-4) ) со строкой @"*" . Вот что он делает: 123456789ABCD изменен на *ABCD, пока я пытаюсь создать ********ABCD. Я понимаю, что он заменил диапазон, который я указал, на объект string. Как это сделать?

Ответ №1:

 NSError *error;

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

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

Комментарии:

1. Попробуйте @"d " в качестве regularExpressionWithPattern: аргумента. Я попробовал \d этот тестер регулярных выражений, и он потерпел неудачу, но d сработал.

2. Исправлено. Просто замените \d на \d в шаблоне. Просто помните, что для регулярных выражений требуется iOS 4 или более поздняя версия. Если вам нужно, чтобы это работало в iOS 3, вам следует использовать NSScanner

3. Проблема с оригиналом заключается в том, что d он будет жадно сопоставлять каждую цифру, которую он может, поэтому все они становятся одним совпадением. Без он соответствует отдельным цифрам и, таким образом, заменяет каждую из них.

4. Ваше решение адресует его точный ввод (1-9, затем ABCD), но оно не отвечает на вопрос, не так ли? Замените все символы в «a» NSString, а не в этой конкретной NSString.. Как это ответ?

5. @JamesBoutcher Потому что вопрос задает это. Вопрос не только в названии.

Ответ №2:

Это выглядит как простая проблема… получите первую часть строки и верните ее с добавлением к ней последних четырех символов.
Вот функция, которая возвращает нужную строку :

 -(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]];
}
  

Ответ №3:

Самая неинтуитивная часть в Cocoa — это создание повторяющихся звездочек без какого-либо неудобного зацикливания. stringByPaddingToLength:withString:startingAtIndex: позволяет создавать повторяющуюся строку любой длины, которая вам нравится, поэтому, как только у вас это получится, вот простое решение:

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

Ответ №4:

Я не уверен, почему принятый ответ был принят, поскольку он работает только в том случае, если все, кроме последних 4, является цифрой. Вот простой способ:

 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);
  

Ответ №5:

Вы могли бы использовать [theString substringToIndex:[theString length]-4] , чтобы получить первую часть строки, а затем объединить [длину строки] -4 * со второй частью. Возможно, это более простой способ сделать это..

Ответ №6:

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

это работает

Комментарии:

1. Вы действительно прочитали мой вопрос или скопировали ответ из моего вопроса? я проголосовал против

2. NSMutableString * str1 = [[NSMutableString alloc]initWithString:@»1234567890ABCD»]; NSMutableString replacementRange = NSMakeRange(0, [длина str1] — 4); NSMutableString * replacementString = [[NSMutableString alloc]init]; для (uint i = 0; i < диапазон замены. длина; i ) { [replacementString appendString:@»*»]; } [str1 replaceCharactersInRange:replacementRange с помощью string:replacementString]; NSLog(@»%@»,str1);

3. replaceCharactersInRange не повторяет строку — он просто заменяет ее. Таким образом, вы берете все символы, кроме последних 4, и заменяете их одним символом *, уменьшая длину строки.

Ответ №7:

Регулярное выражение не работало на iOS7, но, возможно, это помогает:

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

    NSMutableString *secret = [NSMutableString new];

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

    return secret;
}
  

В вашем случае вам следует прекратить замену последних 4 символов. Немного грубо, но выполняет свою работу

Комментарии:

1. Все это возвращает строку, которая *’d out . Как это отвечает на вопрос? (Оставляя последние 4?)

2. Хм, действительно, недостаточно хорошо прочитал. для (int i=0; i<[длина передачи] — 4; i ) { [secret appendString:@»*»]; } затем используйте nsmakerange для копирования последних 4 символов. Но лучший ответ уже есть