我尝试了所有可能的堆栈溢出(link1,link2)回答对我没用。
我正在使用以下正则表达式来验证名字。在线案例(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:“无效”
我错过了什么吗?或者我是否必须更改正则表达式值?有什么建议。
提前致谢。
你可以用
(?:[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]
。
图形:
看,我在操场上尝试了你的代码并改变了一些语法而不是逻辑
下面是代码片段,尝试在游乐场中运行它
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()
希望能帮助到你!