Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/93.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在iOS swift4中进行名字验证?_Ios_Swift_Uitextfield_Uitextfielddelegate - Fatal编程技术网

如何在iOS swift4中进行名字验证?

如何在iOS swift4中进行名字验证?,ios,swift,uitextfield,uitextfielddelegate,Ios,Swift,Uitextfield,Uitextfielddelegate,我有一个名字验证要在swift4中完成,它位于UITextField中。问题是: 名字应该以字母开头,以字母结尾, 没有尾随空格和前导空格。 它们之间可以有空格,也可以包含圆点。 应介于7到18个字符之间。 目前,我正在UITextField中进行以下验证 public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String

我有一个名字验证要在swift4中完成,它位于UITextField中。问题是:

名字应该以字母开头,以字母结尾, 没有尾随空格和前导空格。 它们之间可以有空格,也可以包含圆点。 应介于7到18个字符之间。 目前,我正在UITextField中进行以下验证

public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    let STRING_ACCEPTABLE_CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
    switch textField {
    case firstName:
        print("firstname")
        if string == " " {
            return false
        } else {
            let cs = NSCharacterSet(charactersIn: STRING_ACCEPTABLE_CHARACTERS).inverted
            let filtered = string.components(separatedBy: cs).joined(separator: "")
            return (string == filtered)
        }
    }
    return true
}
任何关于如何实现以下条件的想法。现在我正在禁用空格,只接受字母表


非常感谢您的帮助

您可以使用regex根据您的条件验证名字

我不是正则表达式专家,但是

此正则表达式将返回全部匹配项。您可以检查返回的任何匹配字符串是否有效

以Swift中regex的用法为例

可以使用Swift检查的字符串数,如:

if string.count > 7 && string.count < 18 {
    //String valid
}

您可以使用正则表达式根据您的条件验证名字

我不是正则表达式专家,但是

此正则表达式将返回全部匹配项。您可以检查返回的任何匹配字符串是否有效

以Swift中regex的用法为例

可以使用Swift检查的字符串数,如:

if string.count > 7 && string.count < 18 {
    //String valid
}

从UITextField获取值时,可以检查以下两个条件:

名字应该以字母开头和结尾 在末尾修剪空白。 其余条件可在如下范围内的shouldChangeCharacters内完成:

let STRING_ACCEPTABLE_CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz. "
    switch textField {
    case firstName:
        print("firstname")
        //Condition for always accepting backcspaces
        if string == "" {
            return true
        }
        //Condition for restricting space at the begining
        else if textField.text?.count == 0 && string == " " {
            return false
        }
        //Condition for restricing user from entering more than 18 letters
        else if (textField.text?.count)! > 17 {
          return false
        }
        //Condition for only accepting the alphabets.
        else {
            let cs = NSCharacterSet(charactersIn: STRING_ACCEPTABLE_CHARACTERS).inverted
            let filtered = string.components(separatedBy: cs).joined(separator: "")
            return (string == filtered)
        }
要检查字母的最小数量,请在按钮的单击或类似操作中,在结尾处修剪空白,并以具有以下条件的字母开头和结尾:

//Trimming whitespaces at the end
let firstname = firstName.text?.trimmingCharacters(in: .whitespaces)

let letters = NSCharacterSet.letters

let prefix = String((firstname?.first)!)
let suffix = String((firstname?.last)!)

//Checking if First Character is letter
if let _ = prefix.rangeOfCharacter(from: letters) {
    print("letters found")
} else {
    print("letters not found")
}

//Checking if Last Character is letter
if let _ = suffix.rangeOfCharacter(from: letters) {
    print("letters found")
} else {
    print("letters not found")
}

希望这有帮助。

从UITextField获取值时,可以检查以下两个条件:

名字应该以字母开头和结尾 在末尾修剪空白。 其余条件可在如下范围内的shouldChangeCharacters内完成:

let STRING_ACCEPTABLE_CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz. "
    switch textField {
    case firstName:
        print("firstname")
        //Condition for always accepting backcspaces
        if string == "" {
            return true
        }
        //Condition for restricting space at the begining
        else if textField.text?.count == 0 && string == " " {
            return false
        }
        //Condition for restricing user from entering more than 18 letters
        else if (textField.text?.count)! > 17 {
          return false
        }
        //Condition for only accepting the alphabets.
        else {
            let cs = NSCharacterSet(charactersIn: STRING_ACCEPTABLE_CHARACTERS).inverted
            let filtered = string.components(separatedBy: cs).joined(separator: "")
            return (string == filtered)
        }
要检查字母的最小数量,请在按钮的单击或类似操作中,在结尾处修剪空白,并以具有以下条件的字母开头和结尾:

//Trimming whitespaces at the end
let firstname = firstName.text?.trimmingCharacters(in: .whitespaces)

let letters = NSCharacterSet.letters

let prefix = String((firstname?.first)!)
let suffix = String((firstname?.last)!)

//Checking if First Character is letter
if let _ = prefix.rangeOfCharacter(from: letters) {
    print("letters found")
} else {
    print("letters not found")
}

//Checking if Last Character is letter
if let _ = suffix.rangeOfCharacter(from: letters) {
    print("letters found")
} else {
    print("letters not found")
}

希望这对您有所帮助。

您可以使用此函数来实现简洁明了的效果

func isValid(testStr:String) -> Bool {
    guard testStr.count > 7, testStr.count < 18 else { return false }

    let predicateTest = NSPredicate(format: "SELF MATCHES %@", "^(([^ ]?)(^[a-zA-Z].*[a-zA-Z]$)([^ ]?))$")
    return predicateTest.evaluate(with: testStr)
}
操场测试

编辑

请尝试以下正则表达式:

(?mi)^[a-z](?!(?:.*\.){2})(?!(?:.* ){2})(?!.*\.[a-z])[a-z. ]{5,16}[a-z]$

它还将验证所有条件和长度。

您可以使用此函数进行简短和干净的操作

func isValid(testStr:String) -> Bool {
    guard testStr.count > 7, testStr.count < 18 else { return false }

    let predicateTest = NSPredicate(format: "SELF MATCHES %@", "^(([^ ]?)(^[a-zA-Z].*[a-zA-Z]$)([^ ]?))$")
    return predicateTest.evaluate(with: testStr)
}
操场测试

编辑

请尝试以下正则表达式:

(?mi)^[a-z](?!(?:.*\.){2})(?!(?:.* ){2})(?!.*\.[a-z])[a-z. ]{5,16}[a-z]$

它还将验证所有条件和长度。

听起来不错,但我希望在用户停止编辑并移动到下一个uitextfield时进行验证。如何做到这一点?那就在didEndEditing中做到吧!听起来不错,但我想验证用户何时停止编辑并移动到下一个uitextfield。如何做到这一点?那就在didEndEditing中做到吧!Dahiya先生有效吗?@ElizabethMoly是的,检查最后一个选项。非常感谢。它们之间是否可以只接受一个空格?因为中间的mr6空格也被接受了谢谢我会检查并告诉你Dahiya先生有效吗?@ElizabethMoly是的,检查最后一个选项。非常感谢。它们之间是否可以只接受一个空格?因为中间的mr6空格也被接受了。谢谢。我会检查一下,让你知道。你能考虑一下包含其他字符的非英语名称吗?比如玛丽亚或弗朗索瓦?a-z字符不是唯一存在的字母。我不是说你的亚洲名字验证怎么会失败。我的名字甚至不到7个字符。你能考虑一下包含其他字符的非英语名字吗?比如玛丽亚或弗朗索瓦?a-z字符不是唯一存在的字母。我不是说你的亚洲名字验证怎么会失败。我的名字甚至不到7个字符。