Подтвердить что ты не робот

Objective-C: Лучший способ извлечь подстроку из NSString?

У меня есть строка, разделенная пробелом, например @"abc xyz http://www.example.com aaa bbb ccc".

Как извлечь из него подстроку @"http://www.example.com"?

4b9b3361

Ответ 1

Я знаю, что это очень поздний ответ, но вы можете получить подстроку "http://www.abc.com" со следующим кодом:

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

Конечно, вы можете использовать для этого NSString.

Ответ 2

Попробуйте следующее:

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

Ответ 3

Если все ваши подстроки разделены пробелами, вы можете попытаться получить массив подстрок, используя [myString componentsSeparatedByString:@" "]. Затем вы можете проверить результат [NSUrl URLWithString:yourSubstring]. Он будет возвращать нуль, если подстрока не является правильной ссылкой.

Ответ 4

Это также может помочь решить эту проблему:

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

Я нахожу 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;
}

Ответ 6

Вот моя версия script... Надеюсь, она будет чистой и простой в реализации. Он выполняет подстановку символов на основе ограничений... Mine используется для текстового поля, но, очевидно, может быть адаптирован к текстовым полям:)

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

     }

 }

Ответ 7

Возможное решение может заключаться в использовании регулярных выражений. Проверьте RegexKit.

Ответ 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 для получения только элементов, начинающихся с префикса. Идеальное решение будет зависеть от характера входной строки и того, что вы пытаетесь выполнить с ней.