我尝试了几件事情,比如:
^(?=.*?[A-Z])
^(?=.*?[A-Z])$
^(.*?[A-Z])$
没有任何作用
static func atLeastOneUpperCase(_ input: String) -> Bool {
return NSPredicate(format: "SELF MATCHES %@", upperCaseRegex).evaluate(with: input)
}
输入应该是以上选项之一。
我尝试了几件事情,比如:
^(?=.*?[A-Z])
^(?=.*?[A-Z])$
^(.*?[A-Z])$
没有任何作用
static func atLeastOneUpperCase(_ input: String) -> Bool {
return NSPredicate(format: "SELF MATCHES %@", upperCaseRegex).evaluate(with: input)
}
NSPredicate
与MATCHES
一起使用时,您需要进行完整字符串匹配。let upperCaseRegex = "(?s)[^A-Z]*[A-Z].*"
(?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].*
。但是它不如[^A-Z]*[A-Z].*
高效。如果您确定字符串没有换行符并且它们很短,则.*[A-Z].*
就可以了。 - Wiktor Stribiżew如果你不需要检查大写字母的位置,那么使用[A-Z]
即可。例如在JavaScript中,我会使用/[A-Z]/.test("fRed")
,返回true,而/[A-Z]/.test("fred")
则返回false。
使用:
[A-Z]+
[A-Z]
:匹配 A(ASCII 65)和 Z(ASCII 90)之间的单个字符(区分大小写)。+
量词 - 匹配一次或多次,尽可能多地匹配,必要时回溯(贪婪模式)。在在线演示中查看其工作原理。