一个大写字母验证正则表达式

时间:2015-11-16 11:41:58

标签: ios regex nsregularexpression

我正在为一个长度为4但只包含一个大写字母的字母数字字符进行正则表达式验证。

这是我的代码:

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

但是,它没有正确执行检查。我该怎么办?

3 个答案:

答案 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"

请参阅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 - 明确的字符串开头
  • (?=\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");
}