目标C语言 如何替换NSString中的多个正则表达式匹配



我想知道如何根据一些正则表达式([A-G]#?)替换NSString的特定字符。更分析地说,我有一个充满和弦和空格的NSString
"C a a # b"。

我想要的是根据我制作的字典来改变这些和弦:
@"A", @"A#",
@"#",@"B",
@"B"@"C",
@ @"C","c#",
@"c#"@"D",
@"D"@"D #",
@"D #"@"E",
@"E"@"F",
@"F"@"f#",
@"f#"@"G",
@"G"@"G #",
@"G #"@"A",

意思是
A -> A#和A#-> b
我还想保留任何存在于我的基本和弦之后的东西,意思是:

我已经成功地扫描了字符串,并用我想要的元素替换了元素,在一个新的字符串中,但是我不知道如何在保持初始字符串的空格的同时做到这一点。

为了求和,我想要这样写:
" C A A# B"
变成这样:
" c# A# B C"

谢谢!

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

考虑到您将用不同的值替换源字符串中的所有项,我真的看不到regex在这里的好处。最好的方法可能是简单地将字符串解析为数组:

NSArray *stringArray = [myString componentsSeparatedByString:@" "];

然后使用您选择的任何逻辑(即带有哈希表的枚举器)对数组中的每个值执行映射/替换。

最后将元素重新连接在一起:

NSString *joinedString = [mappedStringArray componentsJoinedByString:@" "];

最新更新