我正在为一个长度为4但只包含一个大写字母的字母数字字符进行正则表达式验证。
这是我的代码:
NSRegularExpression *expression = [NSRegularExpression regularExpressionWithPattern:@"(?=.*[0-9])(?=.*[A-Z])[a-zA-Z0-9]{4}" options:NSRegularExpressionCaseInsensitive error:&error];
但是,它没有正确执行检查。我该怎么办?
答案 0 :(得分:1)
像这样改变你的模式,
@"^(?=.*[0-9])(?=[^A-Z]*[A-Z][^A-Z]*$)[a-zA-Z0-9]{4}$"
答案 1 :(得分:0)
我认为这对你来说已经足够了
@"^(?=.*\\d)(?=.*[A-Z]).{4}$"
或者如果您想要给出最小和最大长度,请使用以下代码段
@"^(?=.*\\d)(?=.*[A-Z]).{4,15}$"
这里4是最小长度,15是你的字符串的最大长度
答案 2 :(得分: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"
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
- 明确的字符串开头(?=\D*\d)
- 检查0位或更多位数后是否至少有1位数(\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");
}