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

Swift regex for checking if string has at least one uppercase letter

我试过几种方法,例如:

^(?=.*?[A-Z])
^(?=.*?[A-Z])$
^(.*?[A-Z])$

没有效果

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

输入应为以上之一。

如果您不检查大写字母的任何特定位置,那么 [A-Z] 将起作用。例如在 javascript 中我会使用 /[A-Z]/.test("fRed") 并得到 true 和 /[A-Z]/.test("fred") returns false.

使用:

[A-Z]+
  • [A-Z]:A(ASCII 65)到Z范围内的单个字符 (ASCII 90)(区分大小写)。
  • + Quantifier — 匹配次数介于一次和无限次之间,尽可能多 尽可能多次,根据需要回馈(贪婪)。

查看它在 Live demo 中的工作情况。

在 Swift 中,当您将 NSPredicateMATCHES 一起使用时,您 需要完整的字符串匹配 .

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

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 考虑因素

如果您需要检查 any 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+ 个字符。