我需要验证信用卡的名字和姓氏。 例如:“Lange Norton”或“LANGE NORTON” 我使用这段代码:
NSString *nameRegex = @"^[A-Z][a-z]*[\pL\pM\p{Nl}][A-Z][a-z]*$";
NSPredicate *nameTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", nameRegex];
return [nameTest evaluateWithObject:nameSurname];
我有空白问题。 “未知的转义序列'\ p'” 我该怎么办?
答案 0 :(得分:6)
我认为你错过了一些大括号
NSString *nameRegex = @"^[A-Z][a-z]*[\p{L}\p{M}\p{Nl}][A-Z][a-z]*$";
如果你还需要whitspace添加\s
您可以找到这些属性的列表(\p{L}\p{M}\p{Nl}
内容)here on regular-expressions.info
\ p {L}或\ p {Letter}:来自任何语言的任何类型的信件
\ p {M}或\ p {Mark}:用于与另一个人合并的角色 字符(例如重音符号,变音符号,封闭框等)。
\ p {Nl}或\ p {Letter_Number}:一个看起来像字母的数字,例如 作为罗马数字。
此外,我不认为你的表达是正确的。
您的字符串需要以[A-Z]
开头,后跟[a-z]*
(也可以为零),然后只有其中一个[\p{L}\p{M}\p{Nl}]
另一个大写ASCII字母后跟小写字母。
如果人名是“RenéMüller”会怎样?
答案 1 :(得分:1)
您应该找到与空格匹配的正确转义序列。
请尝试使用\s
代替\p
。
答案 2 :(得分:1)
不确定将\p
作为转义序列的位置,但正如错误所示,它无效。
[编辑]实际上, 有效,但不是你使用它的方式。
空白的正确转义序列是\s
。这匹配任何有效的空白字符(它们有很多,而不仅仅是普通空格)。
但是,由于您无论如何只验证ASCII字符,因此您可以轻松使用常规空格字符 - 即不需要转义;只需按键盘上的空格键即可。这是一个在正则表达式字符串中匹配的完全有效的字符。
答案 3 :(得分:1)
试试这个:
([^\s]+)\s([^\s]+)(.*)
别忘了逃离目标-c中的\:
NSString *nameRegex = @"([^\\s]+)\\s([^\\s]+)(.*)";
NSPredicate *nameTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", nameRegex];
return [nameTest evaluateWithObject: nameSurname];
这会检查[任何不是空格],然后[空格],然后[任何不是空格],然后[任何]
不会使用名称,例如"宫本茂"
将包括像#34; John Smith(大量空格)Jr"
这样的名字答案 4 :(得分:0)
我同意Spudley的意见,但如果你坚持要验证名称,你应该在卡片上留出几个名字。这将验证无限数量的名称。
[\sA-Za-z]+
答案 5 :(得分:0)
Mb \p{L}
- 它表示Unicode字母中的任何字符,但我不知道,您的正则表达式引擎是否支持此字符。
答案 6 :(得分:0)
除了制作正则表达式之外,还有很多名称验证。这是一个PHP自然名称解析器:
如果我找不到Objective C端口,我会自己动手并在此处发布。
2013年2月7日编辑:
这是我的编码乐趣的端口: