如何在iOS Swift4.2中验证名称(John D'Largy)?

问题描述 投票:3回答:2

我尝试了所有可能的堆栈溢出(link1link2)回答对我没用。

我正在使用以下正则表达式来验证名字。在线案例(OnlineRegex)它工作正常,但当我在移动设备中实现它不起作用。

请帮我

func isValidName() -> Bool {
    let RegEx = "^[a-zA-Z]+(([\\'\\,\\.\\-\\ ][a-zA-Z ])?[a-zA-Z]*)*$"
    let Test = NSPredicate(format:"SELF MATCHES %@", RegEx)
    return Test.evaluate(with: self)
}

我呼吁以上功能为

let str = "John D'Largy"
        if str.isValidName(){
            print("Valid")
        }else{ print("Not valid")}

输出:“有效”

同样的功能我打电话来验证我的第一个文本字段我得到“无效”

if firstNameTxt.text.isValidName(){
            print("Valid")
        }else{ print("Not valid")}

我在移动关键字中输入相同的文字

OutPut:“无效”

我错过了什么吗?或者我是否必须更改正则表达式值?有什么建议。

提前致谢。

ios regex swift4.2
2个回答
2
投票

你可以用

(?:[a-zA-Z]+(?:['‘’,.\\s-]?[a-zA-Z]+)*)?

您已经需要完整字符串匹配的代码,并且您不需要像^ / \A$ / \z这样的显式锚点。

此外,由于单引号会自动转换为引号,您应该将它们添加到正则表达式或turn off the behavior中。

关于正则表达式最重要的一点是它应该能够匹配部分正确的字符串,因此所有部分都是可选的(即它们可以匹配0个字符)。它包含一个匹配1或0次出现的可选非捕获组((?:...)?)。

正则表达式细节

  • [a-zA-Z]+ - 一个或多个字母
  • (?: - 内部非捕获组的开始: ['‘’,.\\s-]? - 1或0个空格,单引号,连字符 [a-zA-Z]+ - 1+个字母
  • )* - 重复0次或更多次。

注意:要匹配任何Unbicode字母,请使用\\p{L}而不是[a-zA-Z]

图形:

enter image description here


1
投票

看,我在操场上尝试了你的代码并改变了一些语法而不是逻辑

enter image description here

下面是代码片段,尝试在游乐场中运行它

    func isValidName(str: String) -> Bool {
       let RegEx = "^[a-zA-Z]+(([\\'\\,\\.\\-\\ ][a-zA-Z ])?[a-zA-Z]*)*$"
       let Test = NSPredicate(format:"SELF MATCHES %@", RegEx)
       return Test.evaluate(with: str)
    }

    func check(){
       let str = "John D'Largy"

       if isValidName(str: str){
           print("Valid")
       }else{
           print("Not valid")
       }
    }

check()

希望能帮助到你!

© www.soinside.com 2019 - 2024. All rights reserved.