2015-11-16 68 views
-2

我正在對長度爲4的字母數字字符進行正則表達式驗證,但只包含一個大寫字母。一個大寫字母驗證正則表達式

這是我的代碼:

NSRegularExpression *expression = [NSRegularExpression regularExpressionWithPattern:@"(?=.*[0-9])(?=.*[A-Z])[a-zA-Z0-9]{4}" options:NSRegularExpressionCaseInsensitive error:&error]; 

但是,它不能正確執行檢查。我該怎麼做?

+0

嘗試更加精細。 – sharvil111

回答

1

改變你的模式就是這樣,

@"^(?=.*[0-9])(?=[^A-Z]*[A-Z][^A-Z]*$)[a-zA-Z0-9]{4}$" 
+0

偉大:)它的工作原理 – jafar

0

我認爲這將是夠你

@"^(?=.*\\d)(?=.*[A-Z]).{4}$" 

或者,如果你想給最小和最大長度,然後用下面的代碼片段

@"^(?=.*\\d)(?=.*[A-Z]).{4,15}$" 

這裏4將是最小長度,15將是您的字符串的最大長度

0

如果您需要區分大寫字母和小寫字母,則需要刪除NSRegularExpressionCaseInsensitive選項。它消除了大寫和小寫之間的區別。

一旦你刪除它,在following regex(如果你需要支持Unicode字母):

@"\\A(?=\\D*\\d)(?=\\P{Lu}*\\p{Lu}\\P{Lu}*\\z)[\\p{L}\\d]{4}\\z" 

或者只是ASCII:

@"\\A(?=\\D*\\d)(?=[^A-Z]*[A-Z][^A-Z]*\\z)[A-Za-z\\d]{4}\\z" 

another regex demo

NSRegularExpression *expression = [ 
NSRegularExpression regularExpressionWithPattern:@"\\A(?=\\D*\\d)(?=[^A-Z]*[A-Z][^A-Z]*\\z)[A-Za-z\\d]{4}\\z" 
    options:0 
    error:&error]; 

正則表達式擊穿:

  • \A - 串
  • 的unambigous開始
  • (?=\D*\d) - 檢查是否有數字後至少1 0或多個非數字(\D*
  • (?=\P{Lu}*\p{Lu}\P{Lu}*\z) - 檢查是否存在僅1個大寫字母(\p{L})在 - 在0或更多之間除大寫字母以外的任何字符(\P{Lu}
  • [\p{L}\d]{4} - 正好是4個字符,可以是字母(小寫或大寫)或數字。
  • \z - 匹配字符串的非歧義末尾。

IDEONE demo導致 「是」:

NSString * s = @"e3Df"; 
NSString * rx = @"\\A(?=\\D*\\d)(?=[^A-Z]*[A-Z][^A-Z]*\\z)[A-Za-z\\d]{4}\\z"; 
NSPredicate * predicat = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", rx]; 
if ([predicat evaluateWithObject:s]) { 
    NSLog (@"yes"); 
} 
else { 
    NSLog (@"no"); 
} 
相關問題