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 中,当您将 NSPredicate
与 MATCHES
一起使用时,您 需要完整的字符串匹配 .
所以,在你的情况下,你需要使用
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+ 个字符。
我试过几种方法,例如:
^(?=.*?[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 中,当您将 NSPredicate
与 MATCHES
一起使用时,您 需要完整的字符串匹配 .
所以,在你的情况下,你需要使用
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+ 个字符。