2017-12-19 11 views
-1

私は、文字列が文字列全体の文字列からサブ文字列を抽出して配列に入れる方法は?

NSString *str = @"M 2 2 C 5 6 7 8 9 1 2 3M 1 2 C 5 6 7 8 9 1 2 3"

私は["2 2","5 6 7 8 9 1 2 3","1 2","5 6 7 8 9 1 2 3"]

のようなサブストリングの配列にしたい、私は私が見つけた ["M":"2 2", "C":"5 6 7 8 9 1 2 3"]

のような辞書にタイプして、それをマップすることが可能である持っていますrangeプロパティを使用して部分文字列を取得する

NSString *str = @"M 2 2 C 5 6 7 8 9 1 2 3M 1 2 C 5 6 7 8 9 1 2 3" 

NSRange r1 = [str rangeOfString:@"M"]; 
NSRange r2 = [str rangeOfString:@"C"]; 
NSRange rSub = NSMakeRange(r1.location + r1.length, r2.location - r1.location - r1.length); 
NSString *sub = [s substringWithRange:rSub]; 

しかし、文字MとCは任意の順序です。どのように私は文字列の長さ全体のためにこれを解決し、配列に配置することができますか?

+0

文字列は動的ですか?私はどんな手紙でもかまいませんし、MとCでなければなりませんか? –

+0

"M 2 2 C 5 6 7 8 9 1 2 3M 1 2 C 5 6 7 8 9 1 2 3"の正確な結果は、 "辞書の型にマップする"という点ではどうでしょうか?次の文字列には2つの 'M'が含まれているため、辞書には 'M'がキーとして1つしか存在しない可能性があります。 –

+2

待って...「2 2」、「5 6 7 8 9 1 2 3」、「1 2」、「5 6 7 8 9 1 2 3」 'のような部分文字列と'' "M": "2 2"、 "C": "5 6 7 8 9 1 2 3"] 'のような辞書の型でマップしたいのですが、配列と辞書はどう関係していますか? Arunが指摘しているように、サンプルデータにはキー「M」が2回ありますが、辞書キーは一意です –

答えて

1

作業溶液:

NSString *str = @"M 2 2 C 5 6 7 8 9 1 2 3M 1 2 C 5 6 7 8 9 1 2 3"; 
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"([A-Z])([\\d\\s]*)" options:0 error:nil]; 

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; 

[regex enumerateMatchesInString:str options:0 range:NSMakeRange(0, [str length]) usingBlock:^(NSTextCheckingResult * _Nullable result, NSMatchingFlags flags, BOOL * _Nonnull stop) { 
    NSString *letter = [str substringWithRange:[result rangeAtIndex:1]]; 
    NSString *numbers = [str substringWithRange:[result rangeAtIndex:2]]; 
    NSMutableArray *subArray = dict[letter]?dict[letter]:[[NSMutableArray alloc] init]; 
    [subArray addObject:numbers]; 
    [dict setObject:subArray forKey:letter]; 
}]; 

NSLog(@"Dict: %@", dict); 

出力:

$>Dict: { 
    C =  (
     " 5 6 7 8 9 1 2 3", 
     " 5 6 7 8 9 1 2 3" 
    ); 
    M =  (
     " 2 2 ", 
     " 1 2 " 
    ); 
} 

仕組み:
私たちは "手紙+ anyamountof(空白+任意の数)" のグループを見つけるために正規表現を使用しています。
「グループ」を定義するためにパターンに余分な括弧を使用します。
我々は一致を列挙し、グループイヤーラーアを定義したので、NSTextCheckingResultrangeAtIndex:が簡単に手紙と数字を得ることができます。
NSDictionary
に保存します。

番号リスト前/後のスペースを削除し、ニーズ

に応じて交換することができるもの:すべてのスペース

$>Dict: { 
    C =  (
     "5 6 7 8 9 1 2 3", 
     "5 6 7 8 9 1 2 3" 
    ); 
    M =  (
     "2 2", 
     "1 2" 
    ); 
} 

をまたは削除:

NSString *numbers = [[str substringWithRange:[result rangeAtIndex:2]] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; 

います

NSString *numbers = [[str substringWithRange:[result rangeAtIndex:2]] stringByReplacingOccurrencesOfString:@" " withString:@""]; 

次の結果が得られます:

$>Dict: { 
    C =  (
     56789123, 
     56789123 
    ); 
    M =  (
     22, 
     12 
    ); 
} 
+0

これは明確ではなかったので、これらの情報で質問を編集してください。結果は辞典ではありません。 Dictは順序がなく、重複するキーを持つことはできません。 – Larme

+0

ちょっとした作業が必要でしたが、REは '@ '([A-Z])([\ [0-9] [。] \\ s] *)" 'で、浮動小数点値を捕捉します。私は一時辞書を作って各辞書を配列に挿入しました。入力いただきありがとうございます。今働いている。 –

関連する問題