Регулярное выражение для анализа строки фамилии и имени, в которой фамилия может быть прописной и / или объединенной

#regex #match

Вопрос:

Мне нужно регулярное выражение, чтобы возвращать ровно три СОВПАДЕНИЯ (не группы) для некоторых входных строк имен, которые могут быть отформатированы любым из следующих способов:

 Last First Middle

LAST First Middle

Last FirstMiddle

LAST FirstMiddle

LastFirst Middle

LASTFirst Middle

LastFirstMiddle

LASTFirstMiddle
 

До сих пор я работал над этим: ([A-Z]{2,})?([A-Z][a-z]*)
Он правильно возвращает три СОВПАДЕНИЯ для всех сценариев, кроме «LASTFirstMiddle» и «LASTFirst Middle», когда фамилия пишется с заглавной буквы и объединяется с именем.

Важно, чтобы результат давал три МАТЧА, а не группы.

Пожалуйста, не могли бы вы предложить регулярное выражение, которое могло бы это поддержать? Спасибо.

Ответ №1:

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

 [A-Z]{2,}(?=[A-Z][a-z]|b)|[A-Z][a-z]*
 

Смотрите демонстрацию регулярных выражений. Подробные сведения:

  • [A-Z]{2,}(?=[A-Z][a-z]|b) — две или более прописных буквы ASCII, за которыми следует заглавная буква ASCII, а затем строчная буква ASCII или граница слова
  • | — или
  • [A-Z][a-z]* — буква ASCII в верхнем регистре, а затем ноль или более строчных букв ASCII.

Комментарии:

1. Спасибо, Виктор — оба варианта отлично работают и являются отличным решением — Спасибо и вам за объяснение. Это очень поможет!