簡體   English   中英

如何替換NSString中的多個正則表達式匹配?

[英]How to replace multiple regular expression matches in NSString?

我想知道如何基於某些正則表達式([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#”,
@“ G#”,@“ A”,

意思是
A-> A#和A#->B。
我也想保留基本和弦之后的所有內容,這意味着:
是-> A#m。

我已經成功掃描了字符串,並在新字符串中用所需的元素替換了元素,但是我不知道如何在保持初始字符串的空間的同時做到這一點。

因此,總而言之,我基本上想要這樣:
“ CAA#B”
成為這個:
“ C#A#BC”

謝謝!

考慮到您將要用不同的值替換源字符串中的所有項目,我真的根本看不到正則表達式的好處。 最好的選擇是將字符串簡單解析為數組:

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

然后使用您選擇的任何邏輯(即,帶有哈希表的枚舉數)對數組中的每個值執行映射/替換。

最后,將元素重新組合在一起:

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

以下代碼在保留所有其他內容的情況下替換了字典中的所有和弦(以便根據要求將“ 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包含所有范圍的匹配子字符串。 然后以相反的順序處理這些范圍(從最后一個匹配到第一個匹配),以便使字符串發生變化(可能會改變長度)不會影響其余范圍的位置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM