Początkowe wyszukiwanie w Google wskazuje, że nie ma wbudowanego sposobu wykonywania wyrażeń regularnych w aplikacji Objective-C Cocoa.
A więc cztery pytania:
Czy to prawda?
Czy ty żartujesz?
Ok, więc czy jest jakaś fajna biblioteka open source, którą polecasz?
Jakie są sposoby, aby zbliżyć się wystarczająco blisko bez importowania biblioteki, na przykład z klasą NSScanner?
objective-c
regex
cocoa
dreeves
źródło
źródło
Odpowiedzi:
Zauważyłem, że od iOS 4.0 Apple udostępnia klasę NSRegularExpression . Dodatkowo, od 10,7 klasa jest dostępna pod OSX .
źródło
Na przykład RegExKitLite nie wymaga żadnych bibliotek, wystarczy dodać .m i .h do projektu.
(Moja skarga na RegExKitLite polega na tym, że rozszerza NSString poprzez kategorię, ale można go również uznać za funkcję. Wykorzystuje również niepubliczne biblioteki ICU dostarczane z systemem operacyjnym, co nie jest zalecane przez Apple.)
źródło
[myString rangeOfString:@"regex_here" options:NSRegularExpressionSearch]
RegexKit jest najlepszym, jaki do tej pory znalazłem. Bardzo kakao: y. Używam wersji „Lite” w kilku naszych aplikacjach na iPhone'a:
sourceforge
lingonikorg
źródło
Możesz użyć biblioteki wyrażeń regularnych POSIX (Yay dla systemu operacyjnego zgodnego z POSIX). Próbować
źródło
Tanie i brudne rozwiązanie hakerskie, którego używam do rozwiązywania problemów z analizą REGEX i JSON, polega na utworzeniu obiektu UIWebView i wstrzyknięciu funkcji JavaScript w celu wykonania analizy. Następnie funkcja javascript zwraca ciąg z wartością (lub listą wartości), na której mi zależy. W rzeczywistości można przechowywać niewielki zestaw funkcji w bibliotece dostosowanych do określonych zadań, a następnie wywoływać je w razie potrzeby.
Nie wiem, czy ta technika skaluje się do ogromnych ilości powtarzających się żądań analizy, ale w przypadku szybkich transakcji wykonuje zadanie bez konieczności korzystania z dodatkowych zasobów zewnętrznych lub kodu, którego możesz nie rozumieć.
źródło
Podoba mi się framework AGRegex, który używa PCRE, przydatny, jeśli jesteś przyzwyczajony do składni PCRE. Najlepsza wersja tego frameworka to ta w kliencie Colloquy IRC, ponieważ została zaktualizowana do korzystania z PCRE 6.7:
http://colloquy.info/project/browser/trunk/Frameworks/AGRegex
Jest bardzo lekki, znacznie bardziej niż RegExKit (choć oczywiście nie tak wydajny).
źródło
NSRegularExpression
jest dostępny od wersji Mac OS X 10.7 i IOS 4.0.źródło
Podczas moich poszukiwań na ten temat natknąłem się na CocoaOniguruma, która używa Oniguruma , silnika wyrażeń regularnych za Ruby 1.9 i PHP5. Wydaje się nieco nowszy w porównaniu do istniejącego OregKit (po japońsku). Nie wiem, jak wypadają na tle innych wiązań.
źródło
Googling alittle, znalazłem tę bibliotekę: RegexOnNSString
Biblioteka open source zawierająca funkcje takie jak:
i używając
NSRegularExpression
class. Dość łatwy w użyciu i nie musisz się o nic martwić.Należy pamiętać, że
NSRegularExpression
jest on dostępny od wersji Mac OS X 10.7 i IOS 4.0, jak wspomniano w Datasmid.źródło
Ułatwiam to. Dodaję nowy plik C ++ do mojego projektu Objective C, zmieniam jego nazwę na .mm, a następnie tworzę w nim standardową klasę C ++. Następnie tworzę statyczną metodę klasy w sekcji "public:" dla funkcji C ++, która pobiera NSString i zwraca NSString (lub NSArray, jeśli tego chcesz). Następnie konwertuję NSString na C ++ std :: string w następujący sposób:
Stamtąd mogę użyć regex_replace w następujący sposób:
Następnie mogę przekonwertować ten std :: string z powrotem na NSString za pomocą:
Jeśli używasz tego języka C ++ tylko dla tej funkcji, możesz uznać za stosowne wywołanie tego pliku extra.mm (nazwa klasy Extra) i umieszczenie tej statycznej metody klasy w, a następnie dodanie innych statycznych metod klasy, gdy nadejdzie sytuacja gdzie po prostu ma sens robienie tego w C ++, ponieważ w niektórych przypadkach jest to mniej kłopotliwe. (Są przypadki, w których ObjC robi coś z mniejszą liczbą wierszy kodu i niektóre przypadki, w których C ++ robi to z mniejszą liczbą wierszy kodu).
PS Jeszcze innym sposobem jest użycie pliku .mm, ale utworzenie opakowania Objective C wokół użycia std :: string i std :: regex_replace () (lub regex_match ()).
źródło