Swift 正则表达式用于检查字符串是否至少有一个大写字母

use*_*711 4 regex uppercase swift

我尝试过以下几种方法:

^(?=.*?[A-Z])
^(?=.*?[A-Z])$
^(.*?[A-Z])$
Run Code Online (Sandbox Code Playgroud)

没有任何作用

static func atLeastOneUpperCase(_ input: String) -> Bool {
    return NSPredicate(format: "SELF MATCHES %@", upperCaseRegex).evaluate(with: input)
}
Run Code Online (Sandbox Code Playgroud)

输入应该是以上之一。

Wik*_*żew 6

在 Swift 中,当您使用NSPredicatewith时MATCHES,您需要完整的字符串匹配

所以,在你的情况下,你需要使用

let upperCaseRegex = "(?s)[^A-Z]*[A-Z].*"
Run Code Online (Sandbox Code Playgroud)

这将匹配以除大写 ASCII 字母之外的 0 个以上字符开头的整个字符串,然后匹配 1 个 ASCII 字母,然后匹配任何 0 个以上字符(因为允许(?s)点匹配包括换行符在内的任何字符)。

另一种方法是使用range(of:options:range:locale:),传递.regularExpression选项:

return input.range(of: "[A-Z]", options: .regularExpression) != nil
Run Code Online (Sandbox Code Playgroud)

这将允许以非锚定的方式匹配正则表达式,即这样,正则表达式引擎将寻找部分匹配,并且不再需要完整的字符串匹配。

统一码注意事项

如果您需要检查任何Unicode 大写字母,请使用\p{Lu}而不是[A-Z]

return input.range(of: "\\p{Lu}", options: .regularExpression) != nil
Run Code Online (Sandbox Code Playgroud)

或者,如果您需要使用NSPredicate版本:

let upperCaseRegex = "(?s)\\P{Lu}*\\p{Lu}.*"
Run Code Online (Sandbox Code Playgroud)

请注意,此处\P{Lu}*匹配除大写字母外的 0+ 个字符。