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.

È stato utile?

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:

  1. se si trova una barra rovesciata, ignora ma copiare il carattere successivo (se esiste) incondizionatamente
  2. 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top