【问题标题】:Objective-C: Find consonants in stringObjective-C:在字符串中查找辅音
【发布时间】:2011-12-13 03:59:51
【问题描述】:

我有一个字符串,其中包含带有辅音和元音的单词。如何从字符串中只提取辅音?

NSString *str = @"consonants.";

结果必须是:

cnsnnts

【问题讨论】:

    标签: iphone objective-c ios nsstring


    【解决方案1】:

    您可以创建一个包含所有元音 (@"aeiouy") 的字符集

    + (id)characterSetWithCharactersInString:(NSString *)aString
    

    然后使用

    - (NSString *)stringByTrimmingCharactersInSet:(NSCharacterSet *)set
    

    方法。

    编辑:这只会删除字符串开头和结尾的元音,正如另一篇文章中指出的那样,您可以做的是使用

    - (NSArray *)componentsSeparatedByCharactersInSet:(NSCharacterSet *)separator
    

    然后将组件重新粘在一起。您可能还需要在集合中包含元音的大写版本,如果您还想处理重音(à á è è ê ì 等...),您可能还必须包含它。

    【讨论】:

    • 感谢回复,我试过这个: NSCharacterSet *vowelsSet = [NSCharacterSet characterSetWithCharactersInString:@"AEIOU"]; NSString *consonants = [[NSString alloc]stringByTrimmingCharactersInSet:vowelsSet];
    • 请注意,马里奥的示例也删除了标点符号。您的解决方案应该提取辅音,而不仅仅是删除元音。
    【解决方案2】:

    不幸的是,stringByTrimmingCharactersInSet 无法工作,因为它只会修剪前导和结束字符,但您可以尝试使用正则表达式和替换,如下所示:

    [[NSRegularExpression
      regularExpressionWithPattern:@"[^bcdefghjklmnpqrstvwx]"
      options:NSRegularExpressionCaseInsensitive
      error:NULL]
     stringByReplacingMatchesInString:str
     options:0
     range:NSMakeRange(0, [str length])
     withTemplate:@""]
    

    您可能希望根据需要调整正则表达式和选项。

    【讨论】:

    • 嗯,这就是 invertedSet 应该解决的问题。但我现在看到它不会像 stringByTrimmingCharactersInSet 那样只修剪前导和结束字符。
    • 我想如果它应该像我们最初想象的那样工作,我会被命名为 strip 而不是 trim,这很棘手:) 更新了我的答案,改为使用正则表达式和替换。
    • 很好的编辑,如果需要,可能必须处理辅音的本地化版本(如ç)。对于 Apple 来说,拥有 [NSCharacterSet setWithAllConsonants] 或类似的东西会非常有用......
    • 如果字符像 . # ( ) 等需要保留。
    • 是的,马里奥可能应该根据自己的需要调整正则表达式,比如将其更改为 @"[aeiou]"
    【解决方案3】:

    可能的,肯定不是最佳的解决方案。我正在打印中间结果以供您学习。注意内存分配(我不在乎)。希望有人会给您一个更好的解决方案,但您可以暂时复制并粘贴它。

    NSString *test = @"Try to get all consonants";
    NSMutableString *found = [[NSMutableString alloc] init];
    NSInteger loc = 0;
    NSCharacterSet *consonants = [NSCharacterSet characterSetWithCharactersInString:@"bcdfghjklmnpqrstvwxyz"];
    while(loc!=NSNotFound && loc<[test length]) {
        NSRange r = [[test lowercaseString] rangeOfCharacterFromSet:consonants options:0 range:NSMakeRange(loc, [test length]-loc)];
        if(r.location!=NSNotFound) {
            NSString *temp = [test substringWithRange:r];
            NSLog(@"Range: %@ Temp: %@",NSStringFromRange(r), temp);
            [found appendString:temp];
            loc=r.location+r.length;
        } else {
            loc=NSNotFound;
        }
    }
    
    NSLog(@"Found: %@",found);
    

    【讨论】:

      【解决方案4】:

      这是一个可以完成这项工作的 NSString 类别:

      - (NSString *)consonants
      {
          NSString *result = [NSString stringWithString:self];
          NSCharacterSet *characterSet = [NSCharacterSet characterSetWithCharactersInString:@"aeiou"];
      
          while(1)
          {
              NSRange range = [result rangeOfCharacterFromSet:characterSet options:NSCaseInsensitiveSearch];
              if(range.location == NSNotFound)
                  break;
      
              result = [result stringByReplacingCharactersInRange:range withString:@""];
          }
      
      
          return result;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-25
        • 2016-06-11
        • 1970-01-01
        • 2018-11-16
        • 1970-01-01
        • 2021-11-02
        • 1970-01-01
        相关资源
        最近更新 更多