2013-01-07 11 views
10

Chcę uzyskać zakresy członków w ramach NSString zbudowanej przy użyciu +[NSString stringWithFormat:]. Jaki jest najlepszy sposób na przeanalizowanie ciągu znaków "cel-c"? Nie mogę po prostu użyć parsera ciągów w formacie C z powodu %@. Ja też należy upewnić się, że obsługuje format uporządkowania: %1$d, %[email protected] itpParse Objective-C printf Ciągi formatów?

Na przykład z łańcucha zbudowanego z [NSString stringWithFormat:@"foo %[email protected] bar %[email protected]", @"Heath", @"Borders"], chciałbym idealnie jak na poniższym NSArray: @[NSMakeRange(15, 5), NSMakeRange(4, 6)]. Pierwszy obiekt tablica odnosi się do pierwszego elementu danych w ciągu formatu, druga tablica obiektu do drugiego elementu danych, itp

W tym przypadku API będzie wyglądać + (NSString *) stringWithFormatRanges:(NSArray **)outFormatRanges withFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2); Byłoby zwracać NSString jak +[NSString stringWithFormat:] , ale zwróci również wartość NSArray dla każdego elementu danych formatu.

- EDIT -

Biorąc pod uwagę, że kwestia ta ma 3 lata, byłbym zadowolony z realizacji C-tylko w tym punkcie.

+0

Analizowanie sposobu, jaki jest twój dokładny wymóg ... proszę wyjaśnić. –

+3

Co masz na myśli przez "zakresy członków?" Chcesz powiedzieć, że chcesz przeanalizować podłańcuchy takie jak "% @", "% 1 $ d" i "% 2 $ @"? – trudyscousin

+0

Wydaje mi się, że najpierw wyodrębnisz poszczególne elementy formatu, być może z RE, następnie napiszesz kod, aby je sprawdzić i sklasyfikować. –

Odpowiedz

5

Zajrzałem do tego kilka lat temu. Jeśli zrozumiem twoje pytanie, nie ma prostego sposobu na uzyskanie AST z ciągu formatu dla ciągów w formacie C lub Cocoa.

Napisałem NSXMLElement + elementWithXMLFormat, który umożliwiał umieszczanie NSXMLElements bez zmiany znaczenia w łańcuchu formatu ze specjalnym kodem formatu %%%@, który wymagał rozszerzenia formatu Cocoa. Moja technika może być pomocne dla Ciebie:

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

wyodrębnić i NUL-wyznaczają tylko kody formatu, uruchom go poprzez tradycyjnie a następnie zmontować.

+0

Dzięki! Przyjrzę to dziś wieczorem. wygląda obiecująco. –

3

pisałem parser dla osób Swift (tak, że można wykryć te zastępcze w Localizable.strings i ekstrakt z których oczekiwano typy należy podać podczas rozmowy stringWithFormat: z tych ciągów) dla mojego narzędzie SwiftGen

Możesz zobaczyć część kodu wykonującego parsowanie there on my GitHub.

  • Jasne, że to nie w Swift i Objective-C, ale myślę, że to trudny do ObjC, tak długo, jak zachować logikę algorytmu.
  • Mój kod nie zwraca zakresów jako wyjścia tych funkcji - tylko typy - ale kod w funkcjach typesFromFormatString zdecydowanie ma dostęp do zakresów tych symboli zastępczych i może całkowicie je zwrócić oprócz wykrytego typu (to proste zmiany, ja po prostu nie potrzebujemy tych zakresów, więc nie obejmują ich typ zwracany)

(Kiedy masz zakresy zastępcze jak %d lub %[email protected], to będzie łatwe do wywnioskowania zakresy parametrów ciągu: pierwszy zakres będzie miał ten sam .location jako pierwszy element zastępczy, ale długość zastąpionej wartości, drugi zakres będzie miał .location drugiego elementu zastępczego + (firstValue.length-firstRange.length) w celu uwzględnienia przesunięcia, itp.)

HTH.