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

时间:2017-06-16 14:54:13

标签: regex swift uppercase

我尝试了几件事:

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

没有效果

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

输入应该是以上之一。

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

在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注意事项

如果您需要检查任何 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 中查看它。

相关问题