名称字段的Regex问题-Swift



我正在尝试创建一个可用于名称的正则表达式。

static let nameRegex =  try! NSRegularExpression(pattern: "^[a-zA-Z][A\p{L}z'\s]{0,19}$", options: [])

我面临两个问题:

  1. 如果我键入撇号,它不会让我再键入任何内容
  2. 由于正则表达式中的[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个字母、'或空白
  • $—字符串结束

最新更新