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

One uppercase letter validation regex

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

这是我的代码:

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

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

像这样改变你的模式,

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

我想这对你来说已经足够了

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

或者,如果您想给出最小和最大长度,请使用以下代码段

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

此处 4 是字符串的最小长度,15 是字符串的最大长度

如果需要区分大小写,需要去掉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) - 检查除大写字母 (\P{Lu})
  • 之外的 0 个或多个字符之间是否只有 1 个大写字母 (\p{L})
  • [\p{L}\d]{4} - 正好是 4 个字母(小写或大写)或数字的字符。
  • \z - 匹配字符串的明确结尾。

IDEONE demo 导致 "yes":

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");
}