替换NSString中的几个不同字符

时间:2012-12-31 16:37:58

标签: objective-c regex nsstring replace nsregularexpression

我正在制作一个供个人使用的iPad应用程序,我正在努力在一些字符串中替换某些字符。例如,我有一个包含“\ t \ t \ t C D”的NSString。现在我要做的是用C#和D#替换每个C和每个D。我设法做到了这一点,但不幸的是它对我来说效率不高。

到目前为止,这是我的代码:

- (IBAction)buttonPressed:(id)sender
{
    if(sender)
    {
        NSError *error;
        NSString *newTab = [[NSString alloc] init];
        NSRegularExpression *regexC = [NSRegularExpression regularExpressionWithPattern:@"C" options:0 error:&error];
        NSRegularExpression *regexD = [NSRegularExpression regularExpressionWithPattern:@"D" options:0 error:&error];

        newTab = [regexC stringByReplacingMatchesInString:self.tab options:0 range:NSMakeRange(0, self.tab.length) withTemplate:@"C#"];

        NSString *newTabAfterFirstRegex = [[NSString alloc] initWithString:newTab];

        newTabAfterFirstRegex = [regexD stringByReplacingMatchesInString:newTab options:0 range:NSMakeRange(0, newTab.length) withTemplate:@"D#"];

        NSLog(@"%@",newTabAfterFirstRegex);
    }

}

另外,这只是一个小测试代码。我真正想做的是有一个算法来检查给定字符串中所有音乐标签的实例(CC#DD#EFF#GG#AA#B),当IBAction被触发时,我希望它们中的每一个被下一个替换(B变为C)。

非常感谢任何想法!

非常感谢!

3 个答案:

答案 0 :(得分:0)

您可以设置正则表达式(例如'[A-G]#?')以匹配某些字符串。使用方法-matchesInString:options:range:,您可以遍历所有匹配(它将为每个匹配返回一个范围)并使用该范围进行替换。

答案 1 :(得分:0)

正则表达式看起来有点像矫枉过正,你可以做两个字符串替换,这样你就不会从正则表达式中获得所有开销,使用

- (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target 
                                    withString:(NSString *)replacement

然后只需更换两次。此外,您不需要执行NSString分配,因为它在返回中创建了一个引用。

答案 2 :(得分:0)

我前几天创建了以下加密方法。我已经为你的目的测试了它,它似乎有效。

-(NSString *)ReplaceMe:(NSString *)s {
// Putting the source into an array
NSMutableArray *myArray = [[NSMutableArray alloc] init];
int i;
for (i = 0; i < s.length; i++) {
    [myArray addObject: [self Mid:s :i :1]];
}
// Creating a string with the revised array
NSMutableString *myString = [NSMutableString new];
for (i = 0; i < s.length; i++) {
    [myString appendString:[self Conversion:[myArray objectAtIndex:i]]];
}
// Final
return myString;
}

上述方法需要两个附加功能。

-(NSString *)Mid:(NSString *)str:(NSInteger)s:(NSInteger)l {
if ((s <= str.length-1) && (s + l <= str.length) && (s >= 0) && (l >= 1)) {
    return [str substringWithRange:NSMakeRange(s, l)];
}
else {
    return @"";
}
}

另一个是......

-(NSString *)Conversion:(NSString *)s {
if ([s isEqualToString:@"C"]) {
    return @"C#";
}
else if ([s isEqualToString:@"D"]) {
    return @"D#";
}
else {
    return s;
}
}

您可以在上面的函数中添加其他转换对。以下是如何使用ReplaceMe的示例。

- (IBAction)clickAction:(id)sender {
textField2.text = [self ReplaceMe:textField1.text];
}

所以它的ReplaceMe很容易使用。