2009-05-10 11 views
10

Jaka jest najlepsza metoda używania Wyrażeń regularnych w Objective-C?Rozwiązanie Regex dla Objective-C

Wygląda na to, że istnieje projekt open source, który zapewnia regex wsparcie, czy ktoś może polecić jeden?

Również patrzyłem na NSPredicate, czy ktoś może sugerować jakieś przykłady regex?

Tło: chcę użyć regex głównie do walidacji, adresów IP, adresów e-mail, Wewnętrzny identyfikator użytkownika itp

+1

duplikat http://stackoverflow.com/questions/422138/regular-expressions-in-an-objective -K-kakao-zastosowanie. Przykłady NSPredicate': http://stackoverflow.com/questions/2458881/nspredicate-and-regex, http://stackoverflow.com/questions/1582700/nspredicate-and-simple-regular-regularpress-problem. Jeśli obawiasz się głównie o kierowanie na system iPhone OS, zobacz http://stackoverflow.com/questions/444772/best-regex-library-for-iphone-sdk-app – outis

Odpowiedz

8

Proszę przeczytać full post na co http://cocoawithlove.com.

w kakao, NSPredicate pracuje w dużo ten sam sposób, jak „gdzie” klauzula SQL. Głównym powodem, że NSPredicate jest doprowadzone do iPhone jest to, że NSPredicate spełnia taką samą rolę w danych Core, że „gdzie” klauzul spełniać w SQL - aby umożliwić trwałe sklep pobrać obiektów, które spełniają kryteria określone .

// given an NSDictionary created used the above method named "row"... 
NSPredicate *johnSmithPredicate = 
    [NSPredicate predicateWithFormat:@"firstname = 'John' AND lastname = 'Smith'"]; 
BOOL rowMatchesPredicate = [johnSmithPredicate evaluateWithObject:row]; 

sprawdzanie adresu email

"podobny" operator porównania w NSPredicate (NSLikePredicateOperatorType) jest powszechnie stosowane jako wygodne środki badania, jeśli NSString dopasowuje Wyrażenie regularne. Jego zaletą jest to, że pełna biblioteka z większymi bibliotekami z większymi opcjami ma teraz , że jest już w bibliotekach Cocoa - no , bez powiązań, bez kłopotów.

Można zrobić prosty test:

NSPredicate *regExPredicate = 
    [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regularExpressionString]; 
BOOL myStringMatchesRegEx = [regExPredicate evaluateWithObject:myString]; 

Jedynym pytaniem pozostaje: co to jest wyrażenie regularne, które mogą być stosowane w celu sprawdzenia, że ​​NSString zawiera składniowo poprawny adres e-mail adres?

NSString *emailRegEx = 
    @"(?:[a-z0-9!#$%\\&'*+/=?\\^_`{|}~-]+(?:\\.[a-z0-9!#$%\\&'*+/=?\\^_`{|}" 
    @"~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\" 
    @"x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-" 
    @"z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5" 
    @"]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-" 
    @"9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21" 
    @"-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])"; 
+0

Zauważyłem, że to potrójne wyrażenie działa na symulatorze iPada, ale nie na sprzęcie iPad (od wersji iOS 4.2). – caleb

1
+1

Nie próbowałem tego, ale wydaje się, że to dokładnie to, co właściwe. (Zwróć uwagę na wymóg umieszczenia informacji o prawach autorskich w rozproszonych programach korzystających z frameworka.) –

2

spróbować z CSRegex: http://www.cocoadev.com/index.pl?CSRegex

rozumie się szybkie i proste klasa regex, które mogą być opuszczane do każdego projektu kakao z minimum zamieszania. Składa się tylko z dwóch plików i nie ma zewnętrznych zależności.

13
NSPredicate *predicate; 
predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES '.*@.*\..*'"]; 
BOOL result = [predicate evaluateWithObject:@"[email protected]"]; 

Według Predicate guide:

Mecze
Wyrażenie lewa równa wyraz prawej ręki przy użyciu porównanie regex stylu według OIOM v3 (więcej szczegółów patrz ICU Podręcznik użytkownika dla Regular Expressions).

Istnieje nawet example written by Apple, który można znaleźć w przewodniku.

Zamiast SELF można również użyć numeru key path. (. I ewentualnie some other literals zbyt)

Powiązane problemy