Objective c 替换NSString中的几个不同字符

Objective c 替换NSString中的几个不同字符,objective-c,regex,nsstring,replace,nsregularexpression,Objective C,Regex,Nsstring,Replace,Nsregularexpression,我正在制作一个供个人使用的iPad应用程序,我正在努力替换一些字符串中的字符。例如,我得到一个NSString,其中包含“\t\t\t cd”。现在我要做的是用C和D替换每个C和D。我已经设法做到了,但不幸的是,在我看来,这根本没有效率 以下是我目前的代码: - (IBAction)buttonPressed:(id)sender { if(sender) { NSError *error; NSString *newTab = [[NSStrin

我正在制作一个供个人使用的iPad应用程序,我正在努力替换一些字符串中的字符。例如,我得到一个NSString,其中包含“\t\t\t cd”。现在我要做的是用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);
    }
}

另外,这只是一个小测试代码。我真正想做的是有一个算法来检查给定字符串中所有音乐标签的实例(C C#D D#E F F F#G#A A#B),当iAction被触发时,我希望它们中的每一个都被下一个替换(B变成C)

任何想法都将不胜感激


多谢各位

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

正则表达式似乎有点过分了。对于这一点,您可以使用

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

换两次就行了。另外,您不需要执行NSString分配,因为它会在返回中创建一个引用。

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

-(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;
}
您可以在上面的函数中放置其他转换对。以下是如何使用ReplaceMe的示例

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

因此,它很容易使用。

谢谢迪德里克。我会试试看,然后再打给你!你好!我照你的建议做了。最后我得到了一个数组,其中包含一对元素“{4,1}{[a-G]#?0x0}”,“{6,1}{[a-G]#?0x0}”,我不确定如何替换范围中的子字符串。我在文档中看到这两个元素属于NSTextCheckingResult类,它们有一个range属性,但我应该如何使用它?我知道{4,1}和{6,1}是需要替换的字符的范围,但是我还是不知道如何从这些范围中获取字符,并以某种方式进行比较,然后进行更改。非常感谢你!由
匹配生成的数组中的NSTextCheckInResult对象Installing:options:range
具有
range
属性。然后,您可以使用NSString的
-StringByReplacingCharactersRange:withString:
替换字符。您可以使用NSString的
-substringWithRange:
获取范围的字符串,谢谢非常感谢你的时间。我对上面的例子进行了测试,它确实有效,但是如果一个字符串包含“C C#D#”,并且假设您在(NSString*)转换:(NSString*)中设置了更多条件,那么不幸的是,它将无法识别C和C之间的区别。它会把它当作C。也许我可以试着在里面混合一些正则表达式。再次非常感谢。这很有帮助!!!
-(NSString *)Conversion:(NSString *)s {
if ([s isEqualToString:@"C"]) {
    return @"C#";
}
else if ([s isEqualToString:@"D"]) {
    return @"D#";
}
else {
    return s;
}
}
- (IBAction)clickAction:(id)sender {
textField2.text = [self ReplaceMe:textField1.text];
}