0

正規表現 ([AG]#?) に基づいて NSString の特定の文字を置き換える方法を知りたいです。より分析的には、
「CAA# B」などのコードとスペースでいっぱいの NSString があります。

私がしたいのは、私が作成した辞書に基づいてこれらのコードを変更することです:
@"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

次のコードは、他のすべてを保持しながら辞書のすべての和音を置き換えます (したがって、要求に応じて "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 に答える
2

ソース文字列のすべての項目をさまざまな値に置き換えることを考えると、ここでは正規表現の利点はまったくわかりません。あなたの最善の策は、単に文字列を配列に解析することです。

すなわち

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

次に、選択したロジック (つまり、ハッシュテーブルを使用した列挙子) を使用して、配列内の各値に対してマッピング/置換を実行します。

そして最後に、要素を元に戻すだけです:

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