0

我想知道如何根据一些正则表达式([AG]#?)替换 NSString 的特定字符。更具分析性,我有一个充满和弦和空格的 NSString,
例如“CAA# B”。

我想要的是根据我制作的字典更改这些和弦:
@“A”,@“A#”,
@“A#”,@“B”,
@“B”,@“C”,
@“C” 、@"C#"、
@"C#"、@"D"、
@"D"、@"D#"、
@"D#"、@"E"、
@"E"、@"F"、
@"F" , @"F#",
@"F#", @"G",
@"G", @"G#",

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

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

所以总结一下,基本上我希望这个:
“CAA# B”
变成这个:
“C# A# B C”

谢谢!

4

2 回答 2

2

考虑到您将用不同的值替换源字符串中的所有项目,我真的完全看不到正则表达式的好处。您最好的选择可能是将字符串简单地解析为数组:

IE

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

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

最后将元素重新组合在一起:

NSString *joinedString = [mappedStringArray componentsJoinedByString:@" "];
于 2013-01-10T20:43:27.137 回答
2

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

于 2013-01-10T21:12:48.950 回答