Il modo migliore per dividere una stringa in token saltare i delimitatori sfuggiti?
-
20-09-2019 - |
Domanda
Ricevo un NSString
che utilizza le virgole come delimitatori, e una barra rovesciata come carattere di escape. Stavo guardando nel suddividere la stringa utilizzando componentsSeparatedByString
, ma ho trovato alcun modo per specificare il carattere di escape. C'è un modo incorporato per fare questo? NSScanner? CFStringTokenizer?
In caso contrario, sarebbe meglio per dividere la stringa alle virgole, e poi ricongiungersi gettoni che sono stati falsamente split (dopo di loro ispezione per una (non sfuggì) sfuggire carattere alla fine) oppure scorrendo ogni personaggio cercando di trovare una virgola, e poi guardando indietro di un carattere per vedere se la virgola è sfuggito o meno (e quindi un carattere più per vedere se il carattere di escape è sfuggito).
Ora che ci penso, avrei bisogno di verificare che la quantità di caratteri di escape prima di un delimitatore è ancora, perché solo allora è il delimitatore in sé non essere sfuggito.
Se qualcuno ha un metodo che fa questo, sarei grato se potessi dare un'occhiata a questo.
Soluzione 3
D'accordo, (spero) questo è ciò che wipolar suggerito. E 'la prima implementazione che funziona. Ho appena iniziato con una lingua non-GC-raccolto, quindi si prega di inviare un commento, se si pensa che questo codice può essere migliorata, soprattutto nel reparto di gestione della memoria.
- (NSArray *) splitUnescapedCharsFrom: (NSString *) str atChar: (char) delim withEscape: (char) esc
{
NSMutableArray * result = [[NSMutableArray alloc] init];
NSMutableString * currWord = [[NSMutableString alloc] init];
for (int i = 0; i < [str length]; i++)
{
if ([str characterAtIndex:i] == esc)
{
[currWord appendFormat:@"%c", [str characterAtIndex:++i]];
}
else if ([str characterAtIndex:i] == delim)
{
[result addObject:[NSString stringWithString:currWord]];
[currWord release];
currWord = [[NSMutableString alloc] init];
}
else
{
[currWord appendFormat:@"%c", [str characterAtIndex:i]];
}
}
[result addObject:[NSString stringWithString:currWord]];
[currWord release];
return [NSArray arrayWithArray:result];
}
Altri suggerimenti
Credo che il metodo più semplice per fare questo sarebbe quello di passare attraverso il personaggio stringa di caratteri come lei suggerisce, aggiungendo in nuovi oggetti stringa. È possibile seguire due semplici regole:
- se si trova una barra rovesciata, ignora ma copiare il carattere successivo (se esiste) incondizionatamente
- se si trova una virgola, fine di quella sezione
Si potrebbe fare questo manualmente o utilizzare alcune delle funzionalità di NSScanner per aiutarvi (scanUpToCharactersFromSet: intoString:)
Io preferirei usare un normale parser basato espressione per eliminare i caratteri di escape e poi eventualmente a fare un'operazione di split (di un certo tipo) sulla stringa.