【问题标题】:Replacing several different characters in NSString替换 NSString 中的几个不同的字符
【发布时间】:2012-12-15 18:02:48
【问题描述】:

我正在制作一个供个人使用的 iPad 应用程序,但我正在为某些字符串中的一些字符替换而苦苦挣扎。例如,我得到了一个包含“\t\t\t C D”的 NSString。现在我想做的是用 C# 和 D# 替换其中的每个 C 和每个 D。我已经设法做到了,但不幸的是,它在我看来根本没有效率。

到目前为止,这是我的代码:

- (IBAction)buttonPressed:(id)sender
{
    if(sender)
    {
        NSError *error;
        NSString *newTab = [[NSString alloc] init];
        NSRegularExpression *regexC = [NSRegularExpression regularExpressionWithPattern:@"C" options:0 error:&error];
        NSRegularExpression *regexD = [NSRegularExpression regularExpressionWithPattern:@"D" options:0 error:&error];

        newTab = [regexC stringByReplacingMatchesInString:self.tab options:0 range:NSMakeRange(0, self.tab.length) withTemplate:@"C#"];

        NSString *newTabAfterFirstRegex = [[NSString alloc] initWithString:newTab];

        newTabAfterFirstRegex = [regexD stringByReplacingMatchesInString:newTab options:0 range:NSMakeRange(0, newTab.length) withTemplate:@"D#"];

        NSLog(@"%@",newTabAfterFirstRegex);
    }

}

另外,这只是一个小的测试代码。我真正想做的是有一个算法来检查给定字符串中所有音乐标签(CC#DD#EFF#GG#AA#B)的实例,并且当触发IBAction时,我希望它们中的每一个被下一个替换(B变成C)。

任何想法都将不胜感激!

非常感谢!

【问题讨论】:

    标签: objective-c regex nsstring replace nsregularexpression


    【解决方案1】:

    前几天我创建了以下加密方法。我已经根据您的目的对其进行了测试,它似乎有效。

    -(NSString *)ReplaceMe:(NSString *)s {
    // Putting the source into an array
    NSMutableArray *myArray = [[NSMutableArray alloc] init];
    int i;
    for (i = 0; i < s.length; i++) {
        [myArray addObject: [self Mid:s :i :1]];
    }
    // Creating a string with the revised array
    NSMutableString *myString = [NSMutableString new];
    for (i = 0; i < s.length; i++) {
        [myString appendString:[self Conversion:[myArray objectAtIndex:i]]];
    }
    // Final
    return myString;
    }
    

    上面的方法需要两个额外的函数。

    -(NSString *)Mid:(NSString *)str:(NSInteger)s:(NSInteger)l {
    if ((s <= str.length-1) && (s + l <= str.length) && (s >= 0) && (l >= 1)) {
        return [str substringWithRange:NSMakeRange(s, l)];
    }
    else {
        return @"";
    }
    }
    

    另一个是……

    -(NSString *)Conversion:(NSString *)s {
    if ([s isEqualToString:@"C"]) {
        return @"C#";
    }
    else if ([s isEqualToString:@"D"]) {
        return @"D#";
    }
    else {
        return s;
    }
    }
    

    您可以在上面的函数中放入其他转换对。以下是如何使用 ReplaceMe 的示例。

    - (IBAction)clickAction:(id)sender {
    textField2.text = [self ReplaceMe:textField1.text];
    }
    

    所以它的 ReplaceMe 非常好用。

    【讨论】:

    • 您好,非常感谢您抽出宝贵的时间。我测试过,它确实适用于上面的示例,但是如果一个字符串包含“CC# DD#”并且假设你在 (NSString *)Conversion:(NSString *)s 中创建了更多条件,那么不幸的是它不能识别 C 和 C# 之间的区别。它会将其视为 C。也许我可以尝试在其中混合一些正则表达式。再次非常感谢您。很有帮助!!!
    【解决方案2】:

    正则表达式似乎有点矫枉过正,你可以只做两个字符串替换,这样你就不会从正则表达式中得到所有开销,使用

    - (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target 
                                        withString:(NSString *)replacement
    

    只需更换两次。此外,您不需要进行 NSString 分配,因为它会在返回中创建一个引用。

    【讨论】:

      【解决方案3】:

      您可以设置正则表达式(例如 '[A-G]#?')来匹配某些字符串。使用-matchesInString:options:range: 方法,您可以遍历所有匹配项(它将为每个匹配项返回一个范围)并使用该范围进行替换。

      【讨论】:

      • 谢谢迪德里克。我会尝试并回复您!
      • 您好!我按照你的建议做了。我最终得到了一个包含几个元素的数组“ {4, 1}{ [AG]#? 0x0}”, “{6, 1}{ [AG]#? 0x0}" 我不确定我应该如何替换范围中的子字符串。我在文档中看到这两个元素属于 NSTextCheckingResult 类,它们有一个 range 属性,但我应该如何使用它?
      • 我知道 {4,1} 和 {6,1} 是需要替换的字符的范围,但我还是不知道如何从这些字符中获取字符范围并以某种方式比较它们,然后进行更改。非常感谢!
      • matchesInString:options:range 产生的数组中的 NSTextCheckingResult 对象有一个range 属性。然后您可以使用 NSString 的-stringByReplacingCharactersInRange:withString: 来替换字符。
      • 可以用NSString的-substringWithRange:获取范围的字符串
      猜你喜欢
      • 2011-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多