web-dev-qa-db-fra.com

Objective-C: Meilleur moyen d’extraire une sous-chaîne de NSString?

J'ai une chaîne séparée par des espaces, comme @"abc xyz http://www.example.com aaa bbb ccc".

Comment puis-je en extraire la sous-chaîne @"http://www.example.com"?

35
ThyPhuong

Je sais que c'est une réponse très tardive, mais vous pouvez obtenir la sous-chaîne "http://www.abc.com" avec le code suivant:

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

Bien sûr, vous pouvez toujours utiliser une NSString pour cela.

51
Justin

Essaye ça:

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

Si toutes vos sous-chaînes sont séparées par des espaces, vous pouvez essayer d'obtenir un tableau de sous-chaînes à l'aide de [myString componentsSeparatedByString:@" "]. Ensuite, vous pouvez vérifier le résultat de [NSUrl URLWithString:yourSubstring]. Il retournera nil si la sous-chaîne n'est pas un lien correct.

12
Morion

Voici ma version du script ... Espérons que ce soit propre et facile à implémenter . Il fait une partie des caractères basée sur des limites ... Mine est utilisé pour une zone de texte, mais peut évidemment être adapté aux champs de texte :)

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

     }

 }
2
rckehoe

Cela peut aussi essayer de résoudre ce problème:

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

J'espère que ça aide!

2
user1873574

Je trouve la substr() de PHP vraiment pratique. Regarde ma catégorie NSString si tu cherches à faire quelque chose comme ça:

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

ou

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

Les deux vous donneront le résultat de http://www.example.com

Voici une copie du code correspondant:

__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;
}
2
mmackh

Une solution possible pourrait utiliser des expressions régulières. Départ RegexKit .

0
Jonathan Sterling

Si votre chaîne d'entrée a des garanties simples (par exemple, la garantie que les jetons de la chaîne sont toujours délimités par un caractère d'espacement), divisez le caractère d'espacement et testez chaque élément pour @"http://" comme préfixe.

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

Ceci peut être optimisé en fonction des besoins de l'application. Par exemple, choisissez de court-circuiter la boucle une fois l'élément trouvé ou utilisez des filtres dans BlocksKit pour obtenir uniquement les éléments commençant par le préfixe. Une solution idéale dépend de la nature de la chaîne d'entrée et de ce que vous essayez d'accomplir avec.

0
ekillaby