0

私はObjective-Cが初めてなので、次の形式で文字列を配列に分割しようとしています:

NSString *str = @":49:DE:Bahnhofsstr:12:39:11";
NSArray *arr = [str componentsSeparatedByString:@":"];

で次のオブジェクトを受け取りましたarr:

[@"", @"49", @"DE", @"Bahnhofsstr", @"12", @"39", @"11"]

しかし、私はこの形式でそれが必要です:

[@"", @"49", @"DE", @"Bahnhofsstr:12:39:11"]

誰にもアイデアはありますか?

4

2 に答える 2

0

正規表現を使用できます。あなたが望むものはこれです:

^([^:]*):([^:]*):([^:]*):(.*)$

上記は、コロンで区切られたコロンのない 3 つの文字シーケンスと、任意の種類の文字で構成される 4 番目のグループに一致します。at the ^front と$at the end は、それぞれ文字列の先頭と末尾に一致します。それ以外の場合は、 1:2:3:4:49:DE:Bahnhofsstr:12:39:11文字列に一致が埋め込まれているため、無意味に一致します。

括弧は、正規表現の一致が完了すると返されるキャプチャ グループを区切ります。最初のキャプチャ グループは、最初のコロンまでのすべての文字です。2 番目のキャプチャ グループは、1 番目と 2 番目のコロンの間のすべての文字です。3 番目のキャプチャ グループは 2 番目と 3 番目のコロンの間のすべての文字であり、4 番目のキャプチャ グループは 3 番目のコロンの後のすべての文字です。

一致するシーケンス全体である 0 番目のキャプチャ グループもあります。

これを Objective-C で使用する方法は次のとおりです。

NSString* pattern = @"^([^:]*):([^:]*):([^:]*):(.*)$";
NSString* line = @":49:DE:Bahnhofsstr:12:39:11";

NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern: pattern
                                                                       options: 0
                                                                         error: &error];
if (regex == nil)
{
    NSLog(@"Invalid regular expression %@, %@", pattern, error);
}
else
{
    NSArray* matches = [regex matchesInString: line
                                      options: 0
                                        range: NSMakeRange(0, [line length])];
    if ([matches count] == 1)
    {
        // Should only be one match
        NSTextCheckingResult* result = [matches objectAtIndex: 0];
        NSMutableArray* captureGroups = [[NSMutableArray alloc] init];
        // Omit capture group 0 because it will be the whole string
        for (int i = 1 ; i < [result numberOfRanges] ; i++)
        {
            NSRange groupRange = [result rangeAtIndex: i];
            NSString* captureGroup = [line substringWithRange: groupRange];
            [captureGroups addObject: captureGroup];
        }
        NSLog(@"The fields are %@", captureGroups);
    }
    else
    {
        // match error
    }
}
于 2013-07-24T16:02:02.837 に答える