繁体   English   中英

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

[英]Objective-C: Best way to extract substring from NSString?

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

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

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

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

当然,你仍然可以使用NSString

尝试这个:

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

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

这是我的脚本版本...希望它干净,易于实现。 它根据限制执行字符的子字符串...我的用于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;

     }

 }

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

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

希望能帮助到你!

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM