目的C:括弧間でテキストを分割する

Objective C: split text between brackets


質問 written by Irfan @2014-03-28 19:23:29Z

: -4 : 4 : 750

このように見えるテキスト(NSString)を分割する必要があります。

[text],[more text here].

これを行う方法はありますか? 「[」で区切られた括弧内の2つのテキストをString []に格納する必要があります。

コメント 1

出力をtext, more text hereしたいのですが、 text, more text hereか?単一の文字列として?

written by アビゼル14年 @2014-03-28 19:41:53Z

コメント 2

おそらく、文字列のC配列ではなくNSArrayを使用したいでしょう。

written by デイブ14年 @2014-03-28 20:07:46Z

コメント 3

componentSeparatedByStringを使用しようとしましたが、うまく機能しませんでした...

written by エリクル14年 @2014-03-31 18:44:30Z

回答 1 written by CRD @2014-03-28 19:40:57Z
1

この問題は、正規表現とNSRegularExpressionを使用して解決できます。

括弧内のテキストに一致するパターンを作成します。 たとえば、パターン@"\\[([^]]*)]"は開き角括弧\\[一致します- \\[かっこはリテラル文字、閉じ角かっこを除く0個以上の文字として扱うために必要です[^]]* 、参照するテキストをグループ化して([^]]*) 、および閉じ括弧]ます。 必要に応じて、カンマ区切りのブラケットテキストのシーケンスに一致するパターンを作成するか、ブラケットテキストの複数の一致を検索できます。

メソッドregularExpressionWithPattern:options:error:を使用して正規表現を作成したら、 matchesInString:options:range:メソッドを使用して、一致するすべての配列を取得できます。 この配列を処理して、必要な文字列の配列を作成できます。

コメント 1

ありがとうございました!実際、iOSで正規表現の概念を検索し、その方法を見つけました!

written by エリクル14年 @2014-03-31 19:20:47Z

回答 2 written by Abizern @2014-03-28 19:59:10Z
0

@ "[text]、[more text here]。"をオンにするだけの場合 @ "text、more text here"と入力すると、スキャナーを使用できます。

NSString *input = @"[text],[more text here]";

NSScanner *scanner = [NSScanner scannerWithString:input];

NSString *firstString;
NSString *secondString;

NSCharacterSet *openingBracketSet = [NSCharacterSet characterSetWithCharactersInString:@"["];
NSCharacterSet *closingBracketSet = [NSCharacterSet characterSetWithCharactersInString:@"]"];

while (![scanner isAtEnd]) {
    // Scan the opening brace, discarding the result
    [scanner scanString:@"[" intoString:NULL];

    // Scan the first string
    [scanner scanUpToCharactersFromSet:closingBracketSet intoString:&firstString];

    // Scan to the second opening brace, discarding the result
    [scanner scanUpToCharactersFromSet:openingBracketSet intoString:NULL];
    [scanner scanString:@"[" intoString:NULL];

    // Scan the second string
    [scanner scanUpToCharactersFromSet:closingBracketSet intoString:&secondString];
}

NSString *result = [NSString stringWithFormat:@"%@, %@", firstString, secondString];

NSLog(@"result: %@", result);

やり過ぎだと思うかもしれませんが、NSScannersの使用は非常に柔軟であり、知っておくと便利なスキルです。

回答 3 written by dave @2014-03-28 20:06:32Z
0
NSMutableArray * result = [NSMutableArray array];
NSArray * commaSeparatedParenthesizedStrings = [input componentsSeparatedByString:@","];
NSCharacterSet * bracketsToTrim = [NSCharacterSet characterSetWithCharactersInString:@"[]"];
forin (NSString * s in commaSeparatedParenthesizedStrings) {
  [result addObject:[s stringByTrimmingCharactersInSet:bracketsToTrim]];
}

このソリューションは括弧内のカンマを考慮せず、さらに入力からすべての括弧を削除するため、 [[[[[]][[]]hello][][[[][][]][][], [[][[][]world[[]][[]][]]@[@"hello", @"world"]を返し@[@"hello", @"world"]

上記のNSScannerソリューションまたはそれに類するソリューションは、入力文字列を分割するときに括弧内のコンマを確実に回避するために、より堅牢である必要があります。

回答 4 written by aguilarpgc @2014-03-28 20:27:11Z
1

これを試して...

  NSString *testString = @"[more],[more te,xt here],[],[,,,,],[text3]";
  NSArray *array = [testString componentsSeparatedByString:@"],["];
  NSString *text = @"";

  for (int i = 0; i < array.count; i++){
    NSString *word = [array objectAtIndex: i];
    NSString *aux = @"";
    NSRange range;
    if(i == 0){
      range = NSMakeRange(1, word.length - 1);
    }
    else{
      aux = @",";
      if(i == array.count - 1)
        range = NSMakeRange(0, word.length - 1);
      else
        range = NSMakeRange(0, word.length);
    }
    aux = [aux stringByAppendingString:
      [word substringWithRange:range]];
    text = [text stringByAppendingString:aux];
  }
  NSLog(@"%@",text);