これも試すことができます:(別のテストアプリで試すことをお勧めします)
私はあなたのターゲットラインを想定しています:
xyz_ 22 aaaaaaaaaaa bbbbbbbbbbb ccccccccccccccc ddddddddddddd
常に「xyz_ 22」で始まります。ここをチェックしてください:(コメントも参照してください)
// prepared a string similar to what you already have
NSMutableString *xmlfile = [[NSMutableString alloc] initWithFormat:@"%@\n%@\n%@\n%@\n%@\n%@\n%@\n%@\n%@",
@"asasasasasas",
@"wewewewewewe",
@"xyz_ 22 aaaaaaaaaaa bbbbbbbbbbb ccccccccccccccc ddddddddddddd",
@"fgfgfgfgfgfgfg",
@"ererererererer",
@"",
@"abc_ 12 bbbbbbbbbb dddddddd",
@"jkjkjkjkjkjkjk",
@"lalallalalalal"];
NSLog(@"%@", xmlfile); // check out by printing (optional)
NSArray *arr = [xmlfile componentsSeparatedByString:@"\n"]; // first break with NEWLINE character
NSLog(@"%@",arr); // check out by printing (optional)
for (NSString *str in arr) // traverse all lines
{
if([str hasPrefix:@"xyz_ 22"]) // if it starts with "xyz_ 22"
{
NSMutableArray *mArr = [[NSMutableArray alloc] initWithArray:[[str stringByReplacingOccurrencesOfString:@"xyz_ 22 " withString:@""] componentsSeparatedByString:@" "]];
for(int i=0; i< [mArr count];i++ )
{
NSString *tag;
if([[mArr objectAtIndex:i] length] > 3)
{
// If more than three i.e., aaaaa then write <aaa>aaaaaaa<aaa>
tag = [[mArr objectAtIndex:i] substringWithRange:NSMakeRange(0, 3)];
}
else
{
// If less than three i.e., aa then pick <aa>aa<aa> or
a then pick <a>a<a>
tag = [mArr objectAtIndex:i];
}
NSString *s= [[NSString alloc] initWithFormat:@"<%@>%@<%@>", tag, [mArr objectAtIndex:i], tag];
[mArr removeObjectAtIndex:i];
[mArr insertObject:s atIndex:i];
}
NSLog(@"%@", mArr); // prints output
}
}
行頭が「xyz_ 22」で固定されていない場合は、NSRegularExpressionクラスを見て、使用する代わりにそれを使用する必要がありますhasPrefix
。
このサンプル パターンは、次の場合に役立ちます。
@"^(.{3}\_\s*\d{2}\s*)"
このパターンは、3 文字の後にアンダースコアとスペースが続き、その後に 2 桁の数字とスペースが続く行に一致します。
必要に応じて、これらの関数のいずれかを使用できます。
firstMatchInString:オプション:範囲:
一致する文字列:オプション:範囲:
numberOfMatchesInString:オプション:範囲:
それが役に立てば幸い。
幸せなコーディングと読書!!!
編集:
コードを更新しましたが、いいえに疑問があります。コメントで指定したタグ内の文字数。これにより、この問題を回避する方法についてのアイデアが得られます。