2015-11-20 2 views
2

У меня есть один вход, где пользователи должны ввести имя и фамилию. Проблема в том, что мне нужно использовать проверку regEx. Там в списке Требований:Уникальное регулярное выражение для имени и фамилии

  1. Имя должно начинаться с заглавной буквой, (не пробел)
  2. Там не может быть пространство суммируется
  3. Пришло облигатный поддержать это имя и фамилию (все люди в состоянии написать их имя/имя). Пример:

    John Smith 
    and 
    Armirat Bair Hossan 
    
  4. И последний символ не должен быть пробелом.

Пожалуйста, помогите,

ATM У меня есть регулярное выражение, как

^\\p{L}\\[p{L} ,.'-]+$ 

но все отрицает ввод, который не является хорошим

Спасибо за помощь мне

UPDATE:

CORRECT INPUT: 
"John Smith" 
"Alberto del Muerto" 

INCORRECT 
" John Smith " 
" John Smith" 
+0

Добавьте на свой вопрос примеры действительных и недействительных входов –

+0

Пожалуйста, также сообщайте код, который у вас есть. Я думаю, вы можете попробовать ['^ [\ p {Lu} \ p {M}] [\ p {L} \ p {M}, .'-] + (?: [\ p {L} \ p {M } .'-] +) * $ '] (https://regex101.com/r/hO5tU7/2). Не забудьте удвоить backsklashes –

+0

это могло бы помочь: https: //regex101.com^\\ p {L} \\ [p {L}, .'-] + $ – JRsz

ответ

2

Вы можете использовать

^[\p{Lu}\p{M}][\p{L}\p{M},.'-]+(?: [\p{L}\p{M},.'-]+)*$ 

или

^\p{Lu}\p{M}*+(?:\p{L}\p{M}*+|[,.'-])++(?: (?:\p{L}\p{M}*+|[,.'-])++)*+$ 

regex demo Смотрите и demo 2

Java декларация:

if (str.matches("[\\p{Lu}\\p{M}][\\p{L}\\p{M},.'-]+(?: [\\p{L}\\p{M},.'-]+)*")) { ... } 
// or if (str.matches("\\p{Lu}\\p{M}*+(?:\\p{L}\\p{M}*+|[,.'-])++(?: (?:\\p{L}\\p{M}*+|[,.'-])++)*+")) { ... } 

Первый пробой регулярное выражение:

  • ^ - начало строки (не обязательно с matches() методом)
  • [\p{Lu}\p{M}] - 1 буква Unicode (вкл.precomposed из них, как \p{M} матчей диакритиков и \p{Lu} матчей любых прописных Unicode базы букв)
  • [\p{L}\p{M},.'-]+ - соответствует 1 или более Unicode буквы, ,, ., ' или - (если 1 название буква действительны, заменяющих + с - на конец здесь)
  • (?: [\p{L}\p{M},.'-]+)* - 0 или более последовательностей
    • - это пространство
    • [\p{L}\p{M},.'-]+ - 1 или более символов, которые являются буквами Юникода или запятыми или периодами или апострофами или -.
  • $ - конец строки (не обязательно с matches() методом)

Примечание: Иногда, имена которых содержат фигурные апострофы, вы можете добавить их к классам символов ([‘’]).

Второе регулярное выражение менее эффективно, но точнее, так как оно будет соответствовать диакритике после базовых букв. Подробнее о соответствии Unicode письма в regular-expressions.info:

Чтобы соответствовать письму, включая любые диакритические, используйте \p{L}\p{M}*+.

+0

Я предложил [это в комментарии] (https: // regex101 .com/r/hO5tU7/4), поскольку он может соответствовать '\ p {M}' и не проверять в верхнем регистре. Например: '' \ u0300abc'' (который является разложенным 'abc') – Mariano

+0

Наиболее сложный ответ. –

+0

@ Мариано: Я понимаю, но возможно ли диакритическое появление в начале человеческого имени? Я не знаю, могут ли такие случаи существовать. Ах! Это Java, мы можем использовать притяжательные квантификаторы :) –

0

Попробуйте

^[A-Z][a-z]+(([\s][A-Z])?[a-z]+){1,2}$ 

но использовать \\ вместо \ для Java

+0

Не могли бы вы объяснить свой вариант? Я частично не могу понять – Reborn

+0

^- начало строки – VDanyliuk

+0

^- начало строки [A-Z] - первая заглавная буква [a-z] + - одна или несколько строчных букв.После ([\ s] [A-Z])? - пробел и заглавная буква, а [a-z] + - один или несколько строчных букв. {1,2} - часть в скобках может быть 1 или 2 раза (поэтому имя может содержать 2 или 3 части) и $ - конец строки – VDanyliuk

1

Вы сделали опечатку: вторая \\ должна быть перед p. Однако даже в этом случае есть проверка не хватает для завершающего пространства

"^\\p{L}[\\p{L} ,.'-]+$" 

For A .matches следующие будет достаточно

"\\p{L}[\\p{L} ,.'-]*[\\p{L}.]" 

имен, как «дель-Рей, Идальго» не требует начального капитала.

Также я бы посоветовал просто ввести .trim(); представьте себе, что пользователь отклонил вход на ложную заготовку.