下面的代码从字典代替所有的和弦,同时保留一切(使“AM”由“A#M”取代的要求) :
NSDictionary *transposeDict = @{
@"A": @"A#", @"A#": @"B", @"B": @"C", @"C": @"C#", @"C#": @"D",
@"D": @"D#", @"D#": @"E", @"E": @"F", @"F": @"F#", @"F#": @"G",
@"G": @"G#", @"G#": @"A"
};
NSString *melody = @" C A A# B Am";
NSMutableString *transposedMelody = [melody mutableCopy];
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"([A-G]#?)"
options:0
error:NULL];
NSArray *matches = [regex matchesInString:melody options:0 range:NSMakeRange(0, [melody length])];
for (NSTextCheckingResult *match in [matches reverseObjectEnumerator]) {
NSString *oldChord = [melody substringWithRange:match.range];
NSString *newChord = transposeDict[oldChord];
if (newChord != nil)
[transposedMelody replaceCharactersInRange:match.range withString:newChord];
}
NSLog(@"old: %@", melody);
NSLog(@"new: %@", transposedMelody);
输出:
old: C A A# B Am
new: C# A# B C A#m
数组matches
包含匹配子字符串的所有范围。这些范围然后按相反的顺序(从上次匹配到第一次匹配)处理,以便突变字符串(可能会改变长度)不会影响其余范围的位置。
这可能有所帮助:https://developer.apple.com/library/mac/#documentation/Foundation/Reference/NSRegularExpression_Class/Reference/Reference.html –