Имя и фамилия регулярного выражения - PullRequest
3 голосов
/ 13 июля 2011

Мне нужно подтвердить имя и фамилию с кредитной карты.Например: «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];

И у меня проблема с пробелами."Неизвестная escape-последовательность '\ p'" Что мне делать?

Ответы [ 7 ]

6 голосов
/ 13 июля 2011

Я думаю, что вы пропустили некоторые фигурные скобки

NSString *nameRegex = @"^[A-Z][a-z]*[\p{L}\p{M}\p{Nl}][A-Z][a-z]*$";

, если вам также нужно добавить пробел, добавьте \s

Вы можете найти список этих свойств (материал \p{L}\p{M}\p{Nl}) здесь на регулярных-выражениях.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, за которой следуют строчные буквы.

Что произойдет, если имя человека будет "Рене Мюллер"?

1 голос
/ 24 февраля 2016

Попробуйте это:

([^\s]+)\s([^\s]+)(.*)

Не забудьте экранировать \ s в target-c:

NSString *nameRegex = @"([^\\s]+)\\s([^\\s]+)(.*)";
NSPredicate *nameTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", nameRegex];
return [nameTest evaluateWithObject: nameSurname];

Это проверяет [что угодно, не пробел], затем[пробел], затем [что-нибудь, не пробел], затем [что-нибудь]

Не будет работать с именем, таким как "宮本茂"

Будет включать имена, написанные как "Джон Смит (многопробел) Jr "

1 голос
/ 13 июля 2011

Не знаю, где вы получили \p в качестве escape-последовательности, но, как говорит ошибка, она недействительна.

[EDIT] на самом деле, является действительной, но не вкак вы его используете.

Правильная escape-последовательность для пробела: \s.Это соответствует любому действительному пробельному символу (их довольно много, а не только обычных пробелов).

Однако, так как вы все равно проверяете только символы ASCII, вы можете так же легко использовать обычный символ пробела - т.е.побег не требуется;просто нажмите клавишу пробела на клавиатуре.Это совершенно допустимый символ для сопоставления в строке регулярного выражения.

1 голос
/ 13 июля 2011

Вы должны найти правильную escape-последовательность, которая будет соответствовать пробелам.Попробуйте \s вместо \p.

0 голосов
/ 07 февраля 2013

Проверка имен намного больше, чем создание регулярных выражений.Вот синтаксический анализатор естественных имен PHP:

nameparser

Если я не могу найти порт Objective C, я сделаю это сам и опубликую здесь.

РЕДАКТИРОВАНИЕ 2/7/2013:

Вот мой порт для вашего удовольствия от кодирования:

NameParser.h

NameParser.m

0 голосов
/ 13 июля 2011

Мб \p{L} - это означает любой символ из букв Unicode, но я не знаю, поддерживает ли ваш движок регулярных выражений это.

0 голосов
/ 13 июля 2011

Я согласен со Spudley, но если вы настаиваете на подтверждении имени, вам следует указать несколько имен на карточке.Это подтвердит неограниченное количество имен.

[\sA-Za-z]+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...