2012-01-13 12 views
0

非常に長い文字列が1つあります。objective-cのマーカー間の文字列を見つける

マーカーにはマーカーがあり、マーカーの間にはテキストがあります。

例:

<body>blah blah blah</body><body>another string</body> 

は基本的に私は、文字列を反復処理し、マーカー間のテキストを抽出したいです。さらに私はテキストの各文字列を別々の文字列に配置したいと思います。

だから、基本的に私は、で終わるだろう:

string1:blah blah blah 
string2:another string 

私はこれをどのように行うのでしょうか?

編集 - 私は明らかではないかもしれません。 1つの文字列は、同じタイプの多くの多くの区切り文字を持つことになり、入力文字列は文字通りことができるよう:。

<body>blah blah blah</body><body>another string</body><body>blah blah blah</body><body>another string</body><body>blah blah blah</body><body>another string</body><body>blah blah blah</body> 

答えて

3

最初の区切りは一度だけあなたのテキストで表示された場合は、コードを使用することができます:

NSArray *c1 = [text componentsSeparatedByString:@"<body>"]; 
if ([c1 count]<2) { 
    // you don't have first delimiter 
} 
NSArray *c2 = [[c1 objectAtIndex:1] componentsSeparatedByString:@"</body>"]; 
if ([c2 count]<2) { 
    // you don't have second delimiter 
} 
NSString *result = [c2 objectAtIndex:0]; 

あなたにもNSScannerを使用することがあります。

NSScanner *scanner = [NSScanner scannerWithString:text]; 
if (![scanner scanUpToString:@"<body>" intoString:nil]) { 
    // there is no opening tag 
} 
NSString *result = nil; 
if (![scanner scanUpToString:@"</body>" intoString:&result]) { 
    // there is no closing tag 
} 

2番目のコードスニペットは、より良いと思われます。

XMLを解析しようとすると複雑になる場合は、NSXMLParserを使用する方が良い場合があります。しかし、このような単純な例では、NSXMLParserの使い方はあまりにも冗長です。

+0

非常に便利です!私はこれを完全に理解しているかどうかはわかりませんが。コードは、タグの間にあるものをどのように取得しますか?これらのタグは1つの文字列に複数回現れることがあります。第2のスニペットスキャナ内の – SirYakalot

+0

は、最初の区切り文字に遭遇するまで文字列を渡します。スキャナは文字列から2番目の区切り文字までのすべての文字を読み込んで記憶します。最初のスニペットも同じですが、複数の開始区切りと終了区切りがある場合は、その動作が理解しにくいです。 –

+0

ああ、2番目の例では、最初の区切り記号は不要です。 – SirYakalot

0

あなたは、あなたは文字列の配列を持つことになりcomponentsSeparatedByStringcomponentsJoinedByString

NSString * dataString = [[NSString alloc] init]; 
dataString = [[dataString componentsSeparatedByString:@"<body>"] componentsJoinedByString:@","]; 
dataString = [[dataString componentsSeparatedByString:@"</body>"] componentsJoinedByString:@""]; 

NSArray *data = [dataString componentsSeparatedByString:@","]; 

を使用することができます。

0

NSRegularExpressionを使用して、正規表現を作成してテキストが一致することを確認できます。区切り文字がすべて同じであれば、かなりシンプルになります。すべての一致を見つけ、配列または新しい文字列を作成してください:

NSError *error = NULL; 
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"<body>(.*)</body>" 
                     options:NSRegularExpressionCaseInsensitive 
                     error:&error]; 
+0

残念ながら、NSRegularExpressionは4.0でのみiOSに登場しました。 <4.0をサポートする必要がある場合は、他のものに頼る必要があります。 –

+0

はい、それは問題の要件ではありませんでした。そのため、最新のSDKの使用が前提となります。最近iOS 4をターゲットにしているアプリはほとんどないと思う。 –

+0

まだ私のアプリのクライアントベースの約5%があります。私はあなたが4未満のiOSをサポートしないことが理にかなっている場合、それはすでに閾値以下であることに同意することができます。 –

関連する問題