2011-10-04 59 views
9

我试图用*替换字符串中除了最后4个字符以外的所有字符。
在objective-c中有NSString类replaceStringWithCharactersInRange: withString:中的一个方法,我会给它的范围为(0,[string length]-4))和字符串@"*"。这就是它的作用:123456789ABCD被修改为* ABCD,而我正在寻找******** ABCD。 我知道它取代了我用字符串对象指定的范围。如何做到这一点?替换NSString中的字符

回答

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

不行的,字符串被通过* – ARC

+0

尝试'代替@ “\ d +”'为你的'regularExpressionWithPattern:'说法。我在[这个正则表达式测试程序](http://regexpal.com/)上试过'\\ d +',它失败了,但'\ d +'工作。 –

+0

修正了它。只需在模式中将\\ d +替换为\\ d即可。请记住,正则表达式需要iOS 4或更高版本。如果你需要它在iOS 3中工作,你应该NSScanner – Lefteris

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

它的工作原理

+0

您是否真的阅读过我的问题或从我的问题中复制了答案?downvoted我 – ARC

+0

对不起,我不明白这个问题 – Vitaliy

+0

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

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

最直观的部分可可创建重复明星没有某种尴尬的循环中。 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; 
} 
-1

的正则表达式没有对iOS7工作,但也许这会有所帮助:

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

    NSMutableString *secret = [NSMutableString new]; 

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

    return secret; 
} 

在你的情况下,你应该停止替换最后4个字符。位原油,但完成工作

+0

所有这些都会返回一个*'d出来的字符串。这是如何回答这个问题的? (离开最后4?) –

+0

确实,没有读得不够好。 for(int i = 0; i <[pass length] - 4; i ++){secret appendString:@“*”]; } 然后使用nsmakerange复制最后4个字符。但更好的答案已经在那里 – CocoaChris

0

我不知道为什么接受的答案被接受,因为它只适用于除了最后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);