2012-02-24 4 views
2

Пытается написать регулярное выражение, которое может анализировать полное имя и разбивать его на имя, имя, фамилию. Это должно быть легко, но довольно сложно, как только вы увидите имена, которые я должен проанализировать. Теперь я могу написать большое длинное регулярное выражение, которое учитывает все эти разные случаи, но я думаю, что возможно меньшее динамическое регулярное выражение, и именно поэтому я здесь прошу о помощи.Разбор имен с регулярным выражением Perl

Я думаю, что это все типы имен, которые я должен захватить.

Некоторые примеры имен, которые должны быть разобраны являются (у каждого есть три запятые в конце):

(first name) (middle intial). (last name),,, //one middle initial with period after 
(first name) (last name),,,     //simple first and last 
(No name),,,         //no name 
(first name) (last name)-(last name),,,  //two last names separated by a dash 
(first name) (middle initial). (middle initial). (last name),,, //two middle initials with space inbetween 
(first name) (last name w/ apostrophe),,, //Last names with apostrophes 
(first name) (Middle name) (Last name),,, //first middle and last name 
+0

Я уже использовал команду split, чтобы разделить каждое поле. Я просто пытаюсь получить имя split. – Trance339

+0

Все они разделены пробелами. Просто используйте '/ (\ S +)? (\ S +)? (\ S +)? (\ S +)? ,,, /' – resmon6

ответ

3

Нет кода, но попробуйте:

  1. использовать substr для удаления последних трех символов с $ name,
  2. @array = split /[\s+.]+/, $ name # split в пространстве и/или точках (как упоминалось выше) в массив,
  3. if ($ array [0]), то у вас есть a имя,
  4. $ lastname = pop @array; # получает последнее (или только) имя
  5. $ firstname = shift @array if scalar @array; # Первое имя первый элемент
  6. @array теперь содержит все отчества и/или инициалы

Что-то вроде этого, во всяком случае ...

3
use 5.010; 
use DDS; 
for (<DATA>) { 
    chomp; 
    s/,,,.*//; 
    if (' ' eq $_) { 
     say 'no name'; 
    } else { 
     /\A (?<first>\S+) \s+ (?<middle>.*?)? (?:\s+)? (?<last>\S+) \z/msx; 
     DumpLex \%+; 
    } 
} 

__DATA__ 
Foo B. Baz,,, 
Fnord Quux,,, 
,,, 
Xyzzy Bling-Bling,,, 
Abe C. D. Efg,,, 
Ed O'postrophe,,, 
First Middle Last,,, 

$HASH1 = { 
      first => 'Foo', 
      last => 'Baz', 
      middle => 'B.' 
     }; 
$HASH1 = { 
      first => 'Fnord', 
      last => 'Quux', 
      middle => '' 
     }; 
no name 
$HASH1 = { 
      first => 'Xyzzy', 
      last => 'Bling-Bling', 
      middle => '' 
     }; 
$HASH1 = { 
      first => 'Abe', 
      last => 'Efg', 
      middle => 'C. D.' 
     }; 
$HASH1 = { 
      first => 'Ed', 
      last => 'O\'postrophe', 
      middle => '' 
     }; 
$HASH1 = { 
      first => 'First', 
      last => 'Last', 
      middle => 'Middle' 
     }; 
+0

Я только что заметил, и это моя ошибка, но когда нет имени, оно буквально не говорит назовите его просто пробел и три запятые. ",,," – Trance339

+0

Я обновил ответ. – daxim

4

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

Рассмотрите: как вы могли бы написать алгоритм, который мог бы правильно разобрать все эти имена в именах «Дано», «Средний» и «Семья»?

  • Боб Мак Intosh
  • Мэри Джейн Уотсон
  • Тёрстон Powell III
  • Майкл ван дер Фельден
  • Жаклин Кеннеди Онассис
  • Доктор Джин Грей
  • Takahashi Shiro
  • Michel La Fontaine
  • Сэр Алек Гиннесс
  • Мэри-Сью Bowes-Lyon
  • Sacha Baron Cohen
  • Джек Арнольд младший

Посмотрите, что я имею в виду? Вам понадобится ИИ, чтобы иметь возможность правильно помещать каждое из этих слов в надлежащий контекст. Некоторые люди используют два имени в качестве своего «имени». Некоторые люди используют титулы или почетные звания, а некоторые культуры сначала помещают фамилию, а имя - последним.

Реферат: Не делайте этого. Если вы не можете заставить пользователя отделить свое имя от определенных кусков для вас, вы должны должны относиться к ним как к атомам.

Смежные вопросы