web-dev-qa-db-ja.com

Objective-C:NSStringから部分文字列を抽出する最良の方法は?

@"abc xyz http://www.example.com aaa bbb ccc"のようなスペースで区切られた文字列があります。

部分文字列@"http://www.example.com"を抽出するにはどうすればよいですか?

35
ThyPhuong

これが非常に遅い返信であることは知っていますが、次のコードでサブストリング「http://www.abc.com」を取得できます。

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

もちろん、そのためにNSStringを使用できます。

52
Justin

これを試して:

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

すべての部分文字列がスペースで区切られている場合、[myString componentsSeparatedByString:@" "]を使用して部分文字列の配列を取得することができます。その後、[NSUrl URLWithString:yourSubstring]の結果を確認できます。部分文字列が正しいリンクでない場合、nilを返します。

12
Morion

これがスクリプトの私のバージョンです...うまくいけば、きれいで簡単に実装できます。これは、制限に基づいて文字のサブストリングを実行します...

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

     }

 }
3
rckehoe

これにより、この問題を解決することもできます。

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

それが役に立てば幸い!

2
user1873574

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

可能な解決策は、正規表現を使用することです。 RegexKit を確認してください。

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のフィルターを使用して、プレフィックスで始まる要素のみを取得します。理想的な解決策は、入力文字列の性質と、それを使って何を達成しようとしているかによって異なります。

0
ekillaby