2013-05-02 26 views
5

Mój format numeru telefonu to (987) 786-5645.NSPredicate na numer telefonu

- (BOOL)validatePhoneNumberWithString:(NSString*)phone 
{ 
    NSString *pNRegex = @"[(0-9)]{3}+\\ +\\[0-9-]{3}+\\[0-9]{4}"; 
    NSPredicate *PNTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pNRegex]; 
    return [PNTest evaluateWithObject:phone]; 
} 

Używam powyższego kodu.

Jaka powinna być dla tego reguła regex? Potrafię wymyślić cyfry, a także nawiasy.

Co powinienem użyć, aby wykryć białą spację po zamknięciu nawiasu?

+0

działa mi ładnie: '\\ ([0-9] {3} \\) \\ s [0-9] {3} - [0-9] {4}'. – holex

+0

lub ... jeśli chcesz, aby białe spacje były opcjonalne: '\\ ([0-9] {3} \\) \\ s? [0-9] {3} - [0-9] {4 } ' – holex

+0

lub ... jeśli chcesz zezwolić na wiele białych znaków:' \ ([0-9] {3} \) (\ s *)? [0-9] {3} - [0-9] {4} '... albo powinienem był je stworzyć i odpowiedzieć, czyż nie? – holex

Odpowiedz

3

Wymień pNRegex z tym,

NSString *pNRegex = @"^(\\([0-9]{3}\\) |[0-9]{3}-)[0-9]{3}-[0-9]{4}$"; 

Nadzieję, że to pomaga.

3

Być może lepszym rozwiązaniem byłoby usunięcie wszystkich nie numerycznych znaków numeru telefonu do sprawdzania poprawności, aby po prostu pozostawiono ciąg liczb.

Wyrażenia regularne mogą się łatwo zepsuć, o ile nie są bardzo surowe w ich wprowadzaniu, a ponieważ numery telefonów różnią się tak bardzo na całym świecie, w ten sposób można obsługiwać dowolny numer telefonu bez konieczności tworzenia bardzo skomplikowanego wyrażenia regularnego.

można po prostu użyć prostego sposobu takiego:

- (NSString *)sanitizePhoneNumberString:(NSString *)phoneNumber { 
    NSCharacterSet *illegalCharacters = [NSCharacterSet characterSetWithCharactersInString:@" +()-"]; 
    return [[phoneNumber componentsSeparatedByCharactersInSet:illegalCharacters] componentsJoinedByString:@""]; 
} 

Więc zamiast +1 (555) 123-4567

Byłbyś Wystarczy porównać 15551234567. Jeśli przechowujesz to w bazie danych, prawdopodobnie chcesz w dowolnej chwili kontrolować format wyświetlania w interfejsie użytkownika, a porównywanie liczb całkowitych jest szybsze niż porównywanie ciągów dla dużych zestawów danych, więc możesz po prostu przechowywać [sanitizedPhoneNumber intValue]; w bazie danych jako NSNumber

Inną metodą za pomocą prostego wyrażenia regularnego, by pozwolić jedynie numery 0-9 (source):

- (NSString *)sanitizePhoneNumberString:(NSString *)phoneNumber { 
    return [phoneNumber stringByReplacingOccurrencesOfString:@"[^0-9]" withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, [phoneNumber length])]; 
} 
1

Użycie tego wyrażenia, pracował dla mnie

NSString *pNRegex = @"\\([0-9]{3}\\) [0-9]{3}\\-[0-9]{4}"; 
1

sprawdzić ten i t'l działa dobrze dla formatt,

jeśli chcesz dać specjalne chrectars jak przestrzeń, (,), a następnie załącza charectar z //

NSString *[email protected]"(123)123-1234"; 
    NSString *pNRegex = @"\\([0-9]{3}\\)[0-9]{3}\\-[0-9]{4}"; 
    NSPredicate *PNTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pNRegex]; 
    BOOL check=[PNTest evaluateWithObject:phone ]; 
    NSLog(@"%i",check); 

O/P: -

(123)123-1234 - check=1 

(123123-1234 - check=0 

(123) 123-1234 - check=0 

jeśli chcesz dać miejsce po użyciu tego jednego wspornika końcowego,

NSString *[email protected]"(123) 123-1234"; 
    NSString *pNRegex = @"\\([0-9]{3}\\)\\ [0-9]{3}\\-[0-9]{4}"; 
    NSPredicate *PNTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pNRegex]; 
    BOOL check=[PNTest evaluateWithObject:phone ]; 
    NSLog(@"%i",check); 

O/P: -

(123) 123-1234 - check=1 

(123123-1234 - check=0 

(123)123-1234 - check=0 
+0

@Hinata Hyuga: czy teraz działa? – Balu

Powiązane problemy