2015-10-05 76 views
2

嗨我需要法國的電話號碼驗證。不能做正則表達式匹配

有效的格式:+262#########

驗證在textDidChang完成:所以每次我需要檢查每一個數字都屬於上述數字。

我正則表達式如下

[[NSPredicate predicateWithFormat:@"SELF MATCHES %@", @"+2?6?2?\d?\d?\d?\d?\d?\d?\d?\d?\d?"] evaluateWithObject:@"+262989878989"] 

儘管執行該行應用程序崩潰

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Can't do regex matching, reason: (Can't open pattern U_REGEX_RULE_SYNTAX (string 2, pattern +2?6?2?\d?\d?\d?\d?\d?\d?\d?\d?\d?, case 0, canon 0))' 

幫我解決這個問題。

+0

法國電話號碼的規則是什麼?他們從262開始,然後有9位數字?共有12個? – NSNoob

+0

@ NSNoob:是的,https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSRegularExpression_Class/這裏我讀了「\ d」獲取數字爲什麼它不工作.. – TamilKing

+0

請參閱Abhinav的答案。它應該工作。只需添加00號碼的驗證規則以及+號碼 – NSNoob

回答

1
[[NSPredicate predicateWithFormat:@"SELF MATCHES %@", @"\\+2?6?2?\\d?\\d?\\d?\\d?\\d?\\d?\\d?\\d?\\d?"] evaluateWithObject:phoneNumber]; 

phoneNumber的將是+2,+26,+262,....... +262 ######### ..

+之前,我需要把\\ 。這是我的錯誤。

+0

這是不正確的。這也將匹配'+ 6999999999'或'+ 2999999999'或甚至+ 999999999'。另外,你需要'\\ d',而不是'\ d'。 – Rob

+0

好吧,我會檢查並更新我的答案 – TamilKing

0
NSString *phoneNumber = ...; 

NSString *phoneRegex = @"^((\\+)|(00))[0-9]{6,14}$"; 

NSPredicate *test = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", phoneRegex]; 
BOOL matches = [test evaluateWithObject:phoneNumber]; 
+0

它看起來像一些複製粘貼問題在這裏。我想在編輯我的文章時,同樣的代碼會粘貼到你的文章中。你能否檢查並恢復到你原來的建議。對於造成不便,我表示歉意。 – Abhinav

+0

好的。我可以編輯你的答案 –

1

\d不工作,因爲它是在一個字符串,你必須逃脫\(例如@"\\d")。您也應該跳過+,因爲它在正則表達式中也有特殊意義(例如@"^\\+262\\d{9}$")。

請注意^$匹配字符串的開頭和結尾,如果這就是您的意思。或者,如果你在大字符串的任何地方查找,你應該檢查字邊界。如果沒有這兩種方法中的一種,則會因+262後跟9個以上字符而導致誤報。

-

如果你想確保有人進入一個數字,這個格式相匹配,你可以這樣做:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 
    NSString *result = [textField.text stringByReplacingCharactersInRange:range withString:string]; 

    return [[NSPredicate predicateWithFormat:@"SELF MATCHES %@", @"^(\\+(2(6(2\\d{0,9})?)?)?)?$"] evaluateWithObject:result]; 
} 

,將匹配任何字符串,它是年初一個有效的電話號碼。

+0

謝謝..雖然類型我需要檢查字符串以正確的數字開始,你能幫我實現這個目標嗎? – TamilKing

+0

我需要檢查,而在textDidChange類型:如果用戶鍵入「+263」我需要限制最後一個數字「3」.. – TamilKing

+0

@TamilKing - 好的,我現在得到你。你可以做'@「^(\\ +(2(6(2 \\ d {0,9})?)?)?)?$」'。我知道這有點毛骨悚然,但你不能只是'?'這些單個字符,而是用'('')'來結尾。假設你試圖在'UITextFieldDelegate'方法中做到這一點,請參閱修訂後的答案。如果你在另一個環境中使用它,你應該可以適應它。 – Rob