我正在尝试创建一个可用于名称的正则表达式。
static let nameRegex = try! NSRegularExpression(pattern: "^[a-zA-Z][A\p{L}z'\s]{0,19}$", options: [])
我面临两个问题:
- 如果我键入撇号,它不会让我再键入任何内容
- 由于正则表达式中的
[a-zA-Z]
,我无法删除文本字段中退格的第一个字符
我正在努力使其限制为20个字符,以字母表开头,并允许特殊字符接受名称,如:José,还有带撇号的名称。
我检查的正则表达式如下:
extension ViewController: UITextFieldDelegate {
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let textFieldText = (textField.text! as NSString).replacingCharacters(in: range, with: string)
let filtered: [NSTextCheckingResult] = Constant.Regex.nameRegex.matches(in: textFieldText, options: [], range: NSMakeRange(0, textFieldText.count))
return filtered.count == 1
}
}
任何帮助都将不胜感激!
您可以使用
"^(?!\P{L})[\p{L}'\s]{0,20}$"
该模式匹配完全匹配以下模式的字符串:
^
-字符串的开头(?!\P{L})
-如果下一个字符不是非字母字符(它需要当前位置或字符串末尾右侧的一个字母(,则会导致匹配失败的负前瞻[\p{L}'\s]{0,20}
-0到20个字母、'
或空白$
—字符串结束