2013-01-07 15 views
10

Desidero ottenere gli intervalli di membri all'interno di uno NSString creato con +[NSString stringWithFormat:]. Qual è il modo migliore per analizzare la stringa di formato obiettivo-c? Non riesco a utilizzare un parser di stringa in formato C a causa di %@. Ho anche bisogno di fare in modo che supporta ordinamenti formato: %1$d, %[email protected], eccParse Objective-C stringhe di formato printf?

Ad esempio, con la stringa costruita con [NSString stringWithFormat:@"foo %[email protected] bar %[email protected]", @"Heath", @"Borders"], Vorrei idealmente come il seguente NSArray: @[NSMakeRange(15, 5), NSMakeRange(4, 6)]. Il primo oggetto matrice corrisponde al primo elemento di dati nella stringa di formato, il secondo oggetto matrice al secondo elemento di dati, ecc

In questo caso, l'API sarebbe simile + (NSString *) stringWithFormatRanges:(NSArray **)outFormatRanges withFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2); Sarebbe restituire un NSString come +[NSString stringWithFormat:] , ma restituirebbe anche un NSArray con NSRange s di ciascun elemento di dati di formato.

- EDIT -

Dato che la questione è di 3 anni, sarei felice con un'implementazione C-solo a questo punto.

+0

Analizzare come, qual è il tuo esatto requisito ... per favore spiega. –

+3

Cosa intendi per "intervalli di membri?" Stai dicendo di voler analizzare sottostringhe come "% @", "% 1 $ d" e "% 2 $ @"? – trudyscousin

+0

Penso che prima dovresti estrarre i singoli elementi di formato, magari con i RE, quindi scrivere il codice per ispezionarli e classificarli. –

risposta

5

Ho esaminato questo alcuni anni fa. Se capisco la tua domanda, non esiste un modo semplice per ottenere l'AST da una stringa di formato per le stringhe di formato C o Cocoa.

Ho scritto NSXMLElement + elementWithXMLFormat che consentiva l'inserimento senza escape di NSXMLElements in una stringa di formato con un codice di formato speciale %%%@, che richiedeva l'estensione del formato di Cocoa. La mia tecnica può essere utile a voi:

https://github.com/rentzsch/nsxmlelement-elementwithxmlformat/blob/937b54b2a830a8fbbd72d6bc5e48bafd495ddcbd/NSXMLElement%2BelementWithXMLFormat.m#L41

estraggo e NUL-delimitano solo i codici di formato, eseguirlo tramite tradizionalmente e poi rimontare.

+0

Grazie! Lo guarderò stasera. sembra promettente. –

3

ho scritto un parser per quelli in Swift (in modo che possa rilevare i segnaposto in Localizable.strings e estratto che ci si aspettava tipi da dare al momento della chiamata stringWithFormat: con quelle corde) per il mio strumento SwiftGen

Potete vedere il parte del codice che esegue l'analisi there on my GitHub.

  • Certo, è in Swift e non in Objective-C ma immagino sia facilmente traducibile in ObjC, purché si mantenga la logica dell'algoritmo.
  • Il mio codice non restituisce gli intervalli come output di tali funzioni - solo i tipi - ma il codice nelle funzioni typesFromFormatString ha sicuramente accesso agli intervalli di quei segnaposto e potrebbe restituirli completamente oltre al tipo rilevato (questo è un cambiamento facile, io non ho bisogno di quelle gamme quindi non li ho incluso nel tipo di ritorno)

(una volta che avete gli intervalli per i segnaposto come %d o %[email protected], sarà facile dedurre gli intervalli per i parametri stringa: il primo intervallo avrà lo stesso .location come 1 segnaposto ma la lunghezza del valore sostituito, il 2 ° intervallo avrà il .location del 2 ° segnaposto + (firstValue.length-firstRange.length) per tenere conto dell'offset, ecc.)

HTH.

Problemi correlati