正则表达式名称和姓氏

时间:2011-07-13 12:50:17

标签: iphone objective-c regex

我需要验证信用卡的名字和姓氏。 例如:“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'” 我该怎么办?

7 个答案:

答案 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自然名称解析器:

nameparser

如果我找不到Objective C端口,我会自己动手并在此处发布。

2013年2月7日编辑:

这是我的编码乐趣的端口:

NameParser.h

NameParser.m