替换NSString中的字符

10

我想用*替换一个字符串中除了最后4个字符之外的所有字符。
在Objective-C中,NSString类中有一个方法replaceStringWithCharactersInRange:withString:,我会给它一个范围(0,[string length]-4)和字符串@"*"。它将把123456789ABCD修改为*ABCD,而我要做到的是********ABCD。我知道它用字符串对象替换了我指定的范围。如何实现?

7个回答

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:@"*"];

修复了。只需将模式中的 \d+ 替换为 \d。请记住,正则表达式需要 iOS 4 或更高版本。如果您需要在 iOS 3 中使用它,请使用 NSScanner。 - Lefteris
你的解决方案解决了他的确切输入(1-9,然后是ABCD),但它并没有回答问题,对吧?替换"a"字符串中的所有字符,而不是特定的NSString。这怎么算是个答案呢? - James Boutcher
@JamesBoutcher 因为问题正在询问这个。一个问题不仅仅是标题。 - Lefteris
@Lefteris - 那个问题中的第一句话怎么样? - James Boutcher
@JamesBoutcher 一个程序员应该知道如何修改答案并根据自己的需求进行调整。您可以更改正则表达式和 NSMakeRange 中的范围以适应您的需求。SO 是为了给您提供指导,而不是提供复制/粘贴代码,这可能最终成为巫术代码,您在不知道它如何工作和为什么的情况下使用它,这是最糟糕的事情。 - Lefteris
显示剩余2条评论

1
我不确定为什么被接受的答案被接受了,因为它只在除了最后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);

1

这看起来像是一个简单的问题...获取第一部分字符串并将其与最后四个字符附加返回。
这里有一个返回所需字符串的函数:

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

0
你可以使用 [theString substringToIndex:[theString length]-4] 来获取字符串的前半部分,然后再用 [theString length]-4 个星号与后半部分组合起来。也许有更简单的方法来实现这个功能...

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

它可以工作


你真的读了我的问题还是复制了我的答案?我已经给你点了踩。 - ARC
NSMutableString * str1 = [[NSMutableString alloc]initWithString:@"1234567890ABCD"]; NSRange replacementRange = NSMakeRange(0, [str1 length] - 4); NSMutableString * replacementString = [[NSMutableString alloc]init();for (uint i = 0; i < replacementRange.length; i++) { [replacementString appendString:@"*"]; } [str1 replaceCharactersInRange:replacementRange withString:replacementString]; NSLog(@"%@",str1); - Vitaliy
replaceCharactersInRange不会重复字符串,它只是替换它。因此,您将除了最后4个字符之外的所有字符都替换为一个*字符,从而缩短字符串的长度。 - James Boutcher

-1

正则表达式在iOS7上无法工作,但也许这可以帮助:

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

    NSMutableString *secret = [NSMutableString new];

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

    return secret;
}

在你的情况下,你应该停止替换最后4个字符。有点粗糙,但能完成任务。

这只是返回一个被星号遮盖的字符串。这怎么回答问题呢?(最后四个字符呢?) - James Boutcher
嗯,确实,没有仔细阅读。对于(int i = 0; i < [pass length] - 4; i ++){      [secret appendString:@“*”]; }然后使用nsmakerange复制最后4个字符。但是已经有更好的答案了。 - CocoaChris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接