【问题标题】:Objective-C: Best way to extract substring from NSString?Objective-C:从 NSString 中提取子字符串的最佳方法?
【发布时间】:2009-10-23 09:31:14
【问题描述】:

我有一个空格分隔的字符串,例如@"abc xyz http://www.example.com aaa bbb ccc"

如何从中提取子字符串@"http://www.example.com"

【问题讨论】:

    标签: objective-c nsstring


    【解决方案1】:

    我知道这是一个很晚的回复,但是您可以使用以下代码获取子字符串“http://www.abc.com”:

    [@"abc xyz http://www.abc.com aaa bbb ccc" substringWithRange:NSMakeRange(8, 18)]
    

    当然,您仍然可以为此使用NSString

    【讨论】:

    • 当我的字符串比范围短时似乎不起作用,我该怎么办?
    • 你只需给它一个不同的范围。最好检查长度 [@"Some string" length] 并将该数字添加到第一个以找到第二个。
    【解决方案2】:

    试试这个:

           [yourString substringToIndex:<#(NSUInteger)#>];
    //or
          [yourString substringFromIndex:<#(NSUInteger)#>];
    //or        
          [yourString substringWithRange:<#(NSRange)#>];
    

    【讨论】:

      【解决方案3】:

      如果您的所有子字符串都用空格分隔,您可以尝试使用[myString componentsSeparatedByString:@" "] 获取子字符串数组。然后你可以检查结果 [NSUrl URLWithString:yourSubstring]。如果子字符串不是正确的链接,它将返回 nil。

      【讨论】:

      • 也许你误解了我,或者我误解了你,但abc.com 只是一个例子。我的意思是如何从 NSString 获取具有 url 链接格式的子字符串。等待您的回复
      • 嗯... NSArray* subStrings = [yourString componentsSeparatedByString:@" "]; for(NSString* subString in subStrings){ if([NSUrl URLWithString: subString]){ NSLog(@"这个子字符串是一个 URL: %@", subString); } }
      • 如果您的子字符串由@" " 分隔,您将在控制台中看到所有子字符串,即正确的 URL。
      【解决方案4】:

      这是我的脚本版本...希望它干净且易于实现。 它根据限制对字符进行 substr... 我的用于 textarea,但显然可以适应 textfields :)

       -(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
       {
      
            int maxLength = 100;
            int currentLength = [self.messageField.text length];
      
            if( currentLength > maxLength )
            {
      
                 NSString *newMessageText = [self.messageField.text substringWithRange:NSMakeRange(0, maxLength)];
      
                 [self.messageField setText:newMessageText];
      
                 return NO;
      
           }
           else
           {
      
                 return YES;
      
           }
      
       }
      

      【讨论】:

        【解决方案5】:

        这个也可以尝试解决这个问题:

        NSArray  *data = [@"abc xyz http://www.abc.com aaa bbb ccc" componentsSeparatedByString:@" "];
        
        for(NSString* str in data)
        {
            if([NSURLConnection canHandleRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:str]]])
                NSLog(@"%@",[[NSString alloc ] initWithFormat:@"Found a URL: %@",str]);
        }
        

        希望对你有帮助!

        【讨论】:

          【解决方案6】:

          我发现 PHP 的 substr() 非常方便。如果您希望能够执行以下操作,请查看我的 NSString category

          substr(@"abc xyz http://www.example.com aaa bbb ccc", 8,-12)
          

          substr(@"abc xyz http://www.example.com aaa bbb ccc", 8, 18)
          

          两者都会给你http://www.example.com的结果

          这是相关代码的副本:

          __attribute__((overloadable))
          NSString *substr(NSString *str, int start)
          {
              return substr(str, start, 0);
          }
          
          __attribute__((overloadable))
          NSString *substr(NSString *str, int start, int length)
          {
              NSInteger str_len = str.length;
              if (!str_len) return @"";
              if (str_len < length) return str;
              if (start < 0 && length == 0)
              {
                  return [str substringFromIndex:str_len+start];
              }
              if (start == 0 && length > 0)
              {
                  return [str substringToIndex:length];
              }
              if (start < 0 && length > 0)
              {
                  return [[str substringFromIndex:str_len+start] substringToIndex:length];
              }
              if (start > 0 && length > 0)
              {
                  return [[str substringFromIndex:start] substringToIndex:length];
              }
              if (start > 0 && length == 0)
              {
                  return [str substringFromIndex:start];
              }
              if (length < 0)
              {
                  NSString *tmp_str;
                  if (start < 0)
                  {
                      tmp_str = [str substringFromIndex:str_len+start];
                  }
                  else
                  {
                      tmp_str = [str substringFromIndex:start];
                  }
                  NSInteger tmp_str_len = tmp_str.length;
                  if (tmp_str_len + length <= 0) return @"";
                  return [tmp_str substringToIndex:tmp_str_len+length];
              }
          
              return str;
          }
          

          【讨论】:

            【解决方案7】:

            可能的解决方案是使用正则表达式。查看RegexKit

            【讨论】:

            • Regexp 几乎总是错误的解决方案。尤其是匹配 URL 是非常困难的,因为正确的正则表达式真的很长。例如,匹配电子邮件地址很难:regular-expressions.info/email.html
            • "有些人在遇到问题时会想“我知道,我会使用正则表达式。”现在他们有两个问题。” regex.info/blog/2006-09-15/247
            【解决方案8】:

            如果您的输入字符串具有简单的保证(例如保证字符串中的标记始终由空格字符描述),则在空格字符上拆分并测试每个元素的 @"http://" 作为前缀。

            NSString *input = @"abc xyz http://www.example.com aaa bbb ccc";
            
            NSArray *parts = [input componentsSeparatedByString:@" "];
            for (NSString *part in parts) {
                if ([part hasPrefix:@"http://"]) {
                    // Found it!
                }
            }
            

            这可以根据应用程序的需要进行优化;例如,选择在找到元素后使循环短路,或使用 BlocksKit 中的过滤器仅获取以前缀开头的元素。一个理想的解决方案将取决于输入字符串的性质以及您尝试使用它完成的任务。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-11-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-09-10
              • 1970-01-01
              • 2023-03-06
              • 2012-11-05
              相关资源
              最近更新 更多