以下代码替换字典中的所有和弦,同时保留其他所有内容(以便根据要求将“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
包含匹配子字符串的所有范围。然后以相反的顺序处理这些范围(从最后一个匹配到第一个匹配),以便改变字符串(这可能会改变长度)不会影响剩余范围的位置。