正規表現を使用できます。あなたが望むものはこれです:
^([^:]*):([^:]*):([^:]*):(.*)$
上記は、コロンで区切られたコロンのない 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
}
}