如果您需要區分大寫字母和小寫字母,則需要刪除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");
}
嘗試更加精細。 – sharvil111