我尝试了几件事:
^(?=.*?[A-Z])
^(?=.*?[A-Z])$
^(.*?[A-Z])$
没有效果
static func atLeastOneUpperCase(_ input: String) -> Bool {
return NSPredicate(format: "SELF MATCHES %@", upperCaseRegex).evaluate(with: input)
}
输入应该是以上之一。
答案 0 :(得分:4)
如果您没有检查大写字母的任何特定位置,那么[A-Z]
将起作用。例如,在javascript中,我会使用/[A-Z]/.test("fRed")
并获得true,/[A-Z]/.test("fred")
将返回false。
答案 1 :(得分:3)
在Swift中,当NSPredicate
与MATCHES
一起使用时,需要完整的字符串匹配。
因此,在您的情况下,您需要使用
let upperCaseRegex = "(?s)[^A-Z]*[A-Z].*"
这将匹配以大写ASCII字母以外的0+字符开头的整个字符串,然后匹配1个ASCII字母,然后匹配任何0+字符(因为(?s)
允许点匹配任何字符包括换行符。)
另一种方法是使用range(of:options:range:locale:)
,传递.regularExpression
选项:
return input.range(of: "[A-Z]", options: .regularExpression) != nil
这将允许以非锚定的方式匹配正则表达式,即这样,正则表达式引擎将寻找部分匹配,并且不再需要完整的字符串匹配。
Unicode注意事项
如果您需要检查任何 Unicode大写字母,请使用\p{Lu}
代替[A-Z]
:
return input.range(of: "\\p{Lu}", options: .regularExpression) != nil
或者,如果您需要使用NSPredicate
版本:
let upperCaseRegex = "(?s)\\P{Lu}*\\p{Lu}.*"
请注意,\P{Lu}*
匹配大写字母以外的0 +字符。
答案 2 :(得分:0)
使用:
[A-Z]+
[A-Z]
:A(ASCII 65)和Z之间范围内的单个字符
(ASCII 90)(区分大小写)。+
量词 - 在一次和无限次之间匹配,尽可能多
尽可能多的时间,根据需要回馈(贪婪)。在 Live demo 中查看它。