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

4

我尝试了几件事情,比如:

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

没有任何作用

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

输入应该是以上选项之一。

给出一些正向匹配和负向匹配的示例。 - m_callens
我不认为第一个正则表达式无法工作。您确定您正确地使用它了吗? - Aran-Fey
3个回答

6
在Swift中,当您使用NSPredicateMATCHES一起使用时,您需要进行完整字符串匹配
因此,在您的情况下,您需要使用:
let upperCaseRegex = "(?s)[^A-Z]*[A-Z].*"

这将匹配一个以0+个大写ASCII字母以外的字符开头的字符串,然后匹配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个或多个非大写字母字符。

最终我使用了:"^(.[A-Z]+." - user3239711
在NSPredicate中,您可以使用.*[A-Z].*。但是它不如[^A-Z]*[A-Z].*高效。如果您确定字符串没有换行符并且它们很短,则.*[A-Z].*就可以了。 - Wiktor Stribiżew

4

如果你不需要检查大写字母的位置,那么使用[A-Z]即可。例如在JavaScript中,我会使用/[A-Z]/.test("fRed"),返回true,而/[A-Z]/.test("fred")则返回false。


0

使用:

[A-Z]+
  • [A-Z]:匹配 A(ASCII 65)和 Z(ASCII 90)之间的单个字符(区分大小写)。
  • + 量词 - 匹配一次或多次,尽可能多地匹配,必要时回溯(贪婪模式)。

在线演示中查看其工作原理。


请注意,在Javascript中,这是一个无限的正则表达式。所以我不会真正使用它。 - Karl Reid
但是这个问题没有标记为JS,不过我对@KarlReid感兴趣,想要改进我的回答。你有什么建议? - gsamaras
谢谢@KarlReid,我更新了我的答案,你觉得现在怎么样? - gsamaras
@KarlReid,我这么做不是因为你告诉我这么做,而是因为你建议我这么做,并且我考虑后认为可以!;) - gsamaras
嗯,它不起作用。您的语法仅在所有字符均为大写时才有效。为了更精确地说明,我正在使用Swift进行开发: - user3239711
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接