Objective-C:从NSString中提取子字符串的最佳方法?

时间:2009-10-23 09:31:15

标签: objective-c nsstring

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

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

8 个答案:

答案 0 :(得分:52)

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

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

当然,您仍然可以使用NSString

答案 1 :(得分:26)

试试这个:

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

答案 2 :(得分:12)

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

答案 3 :(得分:3)

这是我的脚本版本...希望它干净,易于实现。 它根据限制执行字符的子字符串...我的用于textarea,但显然可以适应文本字段:)

 -(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;

     }

 }

答案 4 :(得分:2)

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

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]);
}

希望它有所帮助!

答案 5 :(得分:2)

我发现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;
}

答案 6 :(得分:0)

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

答案 7 :(得分:0)

如果您的输入字符串具有简单的保证(例如,保证字符串中的标记始终由空格字符描述),则拆分空格字符并测试@"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中使用过滤器以仅获取以前缀开头的元素。理想的解决方案取决于输入字符串的性质以及您尝试使用它完成的任务。