【问题标题】:Objective-C: How to extract part of a String (e.g. start with '#')Objective-C:如何提取字符串的一部分(例如以“#”开头)
【发布时间】:2011-10-13 03:22:41
【问题描述】:

我有一个字符串如下图,

NSString * aString = @"This is the #substring1 and #subString2 I want";

如何仅选择以“#”开头(并以空格结尾)的文本,在本例中为“subString1”和“subString2”?

注意:为了清楚起见,对问题进行了编辑

【问题讨论】:

  • 你怎么知道子字符串在哪里结束?
  • 根据问题,我认为他的意思是直到一个空格。

标签: objective-c ios hash nsstring substring


【解决方案1】:

另一个简单的解决方案:

NSRange hashtag = [aString rangeOfString:@"#"];
NSRange word = [[aString substringFromIndex:hashtag.location] rangeOfString:@" "];
NSString *hashtagWord = [aString substringWithRange:NSMakeRange(hashtag.location, word.location)];

【讨论】:

    【解决方案2】:
    [aString substringWithRange:NSMakeRange(13, 10)] 
    

    会给你 substring1

    您可以使用以下方法计算范围:

    NSRange startRange = [aString rangeOfString:@"#"];
    NSRange endRange = [original rangeOfString:@"1"];
    
    NSRange searchRange = NSMakeRange(startRange.location , endRange.location);
    [aString substringWithRange:searchRange] 
    

    会给你 substring1

    阅读更多: Position of a character in a NSString or NSMutableString

    http://iosdevelopertips.com/cocoa/nsrange-and-nsstring-objects.html

    【讨论】:

    • substring1 只是一个例子。寻找“1”的硬编码很糟糕。如果您不知道 # 之后的字符串是什么,这不是一个正确的解决方案。这也不能回答 OP 问题以查找 # 之后出现的每个字符串。 substring2 呢?
    【解决方案3】:

    这就是我要做的:

    NSString *givenStringWithWhatYouNeed = @"What you want to look through";
    NSArray *listOfWords = [givenStringWithWhatYouNeed componentsSeparatedByString:@" "];
    for (NSString *word in listOfWords) {
        if ([[word substringWithRange:NSMakeRange(0, 1)]isEqualToString:@"#"]) {
            NSString *whatYouWant = [[word componentsSeparatedByString:@"#"]lastObject];
        }
    }
    

    然后您可以使用 whatYouWant 实例做您需要的事情。如果你想知道它是哪个字符串(如果是子字符串 1 或 2),请查看 word 字符串在 listOfWords 数组中的索引。

    我希望这会有所帮助。

    【讨论】:

      【解决方案4】:

      相当简单、易于理解的版本避免了NSRange 的东西:

      NSArray * words = [string componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; 
      NSMutableArray * mutableWords = [NSMutableArray new];
      for (NSString * word in words){
          if ([word length] > 1 && [word characterAtIndex:0] == '#'){
              NSString * editedWord = [word substringFromIndex:1];
              [mutableWords addObject:editedWord];
          }
      }
      

      【讨论】:

      • 谢谢!这是最好的答案,因为它最简单有效!
      • 给我一个比较警告。必须创建一个字符串 compare=@"#" 然后必须使用 [word characterAtIndex:0] == [compare characterAtIndex:0]。
      • 是的,很简单+1
      【解决方案5】:

      在 NSString 中选择所有以“#”开头的单词的通用且简单的代码是:

      NSString * aString = @"This is the #substring1 and #subString2 ...";
      NSMutableArray *selection=@[].mutableCopy;
      while ([aString rangeOfString:@"#"].location != NSNotFound)
      {
          aString = [aString substringFromIndex:[aString rangeOfString:@"#"].location +1];
          NSString *item=([aString rangeOfString:@" "].location != NSNotFound)?[aString substringToIndex:[aString rangeOfString:@" "].location]:aString;
          [selection addObject:item];
      }
      

      如果您仍然需要原始字符串,您可以复制一份。 如果您选择的项目是最后一个单词,则使用内联条件

      【讨论】:

        【解决方案6】:

        您可以使用NSScanner 来拆分字符串。此代码将遍历一个字符串并用子字符串填充一个数组。

        NSString * aString = @"This is the #substring1 and #subString2 I want";
        NSMutableArray *substrings = [NSMutableArray new];
        NSScanner *scanner = [NSScanner scannerWithString:aString];
        [scanner scanUpToString:@"#" intoString:nil]; // Scan all characters before #
        while(![scanner isAtEnd]) {
            NSString *substring = nil;
            [scanner scanString:@"#" intoString:nil]; // Scan the # character
            if([scanner scanUpToString:@" " intoString:&substring]) {
                // If the space immediately followed the #, this will be skipped
                [substrings addObject:substring];
            }
            [scanner scanUpToString:@"#" intoString:nil]; // Scan all characters before next #
        }
        // do something with substrings
        [substrings release];
        

        下面是代码的工作原理:

        1. 最多扫描一个#。如果未找到,则扫描仪将位于字符串的末尾。
        2. 如果扫描仪位于字符串的末尾,我们就完成了。
        3. 扫描 # 字符,使其不在输出中。
        4. 最多扫描一个空格,扫描的字符存储在substring 中。如果 # 是最后一个字符,或者后面紧跟一个空格,则该方法将返回 NO。否则它将返回 YES。
        5. 如果扫描了字符(该方法返回 YES),请将 substring 添加到 substrings 数组中。
        6. 转到 1

        【讨论】:

        • 非常感谢!今晚救了我!
        【解决方案7】:

        假设您要查找第一个以磅开头并以空格结尾的字符串,这可能有效。我面前没有 XCode,如果某处出现语法错误或长度减 1,请见谅:

        -(NSString *)StartsWithPound:(NSString *)str {
            NSRange range = [str rangeOfString:@"#"];
            if(range.length) {
                NSRange rangeend = [str rangeOfString:@" " options:NSLiteralSearch range:NSMakeRange(range.location,[str length] - range.location - 1)];
                if(rangeend.length) {
                    return [str substringWithRange:NSMakeRange(range.location,rangeend.location - range.location)];
                }
                else
                {
                    return [str substringFromIndex:range.location];
                }
            }
            else {
                return @"";
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2015-01-28
          • 2013-07-30
          • 1970-01-01
          • 1970-01-01
          • 2021-11-18
          • 2022-10-13
          • 2017-09-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多