0

我正在制作一个供个人使用的 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)。

任何想法将不胜感激!

非常感谢!

4

3 回答 3

0

正则表达式似乎有点矫枉过正,你可以只做两个字符串替换,这样你就不会从正则表达式中得到所有开销,使用

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

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

于 2012-12-31T18:24:46.757 回答
0

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

于 2012-12-31T16:56:50.143 回答
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 非常好用。

于 2012-12-31T18:29:57.603 回答