【问题标题】:How to replace multiple regular expression matches in NSString?如何替换 NSString 中的多个正则表达式匹配?
【发布时间】:2013-01-10 20:35:37
【问题描述】:

我想知道如何根据一些正则表达式 ([A-G]#?) 替换 NSString 的特定字符。 更分析地,我有一个充满和弦和空格的 NSString
例如 “C A A# 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。

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

总而言之,基本上我想要这个:
"C A A# B"
变成这样:
" C# A# B C"

谢谢!

【问题讨论】:

标签: objective-c regex nsstring nsrange


【解决方案1】:

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

【讨论】:

  • 非常感谢!它完美地工作。您的带有 reverseObjectEnumerator 的 for 循环非常棒!我只是用索引循环然后追加。再次感谢!
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 如何处理“我还想保留基本和弦之后存在的任何内容,意思是:Am -> A#m”的要求?这是否意味着您必须测试每个组件是否以必须替换的字符串开始?在这种情况下,我看不到使用正则表达式的优势。
猜你喜欢
  • 2016-03-14
  • 2012-09-28
  • 1970-01-01
  • 1970-01-01
  • 2012-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多