2012-02-24 16 views
2

フルネームを解析して名、ミドルネーム、ラストネームに分割できる正規表現を作成しようとしています。これは簡単なはずですが、私が解析しなければならない種類の名前を見ればかなり難しいでしょう。今私は、これらのすべての異なるケースにaccretにかかる大きな長い正規表現を書くことができますが、私はより小さい動的正規表現が可能であると思うので、私はここでいくつかの助けを求めています。Perlの正規表現で名前を解析する

これは私がつかまえなければならない名前のすべてのタイプだと思います。

解析する必要があるいくつかの例名が(それぞれ3つの末尾にカンマがあります)、次のとおりです。

(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コマンドを使用しましたが、今は名前の分割を取得しようとしています。 – Trance339

+0

これらはすべてスペースで区切られています。 \(S +)?(\ S +)?、//' – resmon6

答えて

3

ないコードを、しかし、試してみてください。

  1. substrを使用して$ nameから最後の3文字を削除します。
  2. @array = split /[s+.]+/、$ name#上で述べたようにスペースとドットを配列に分割
  3. if($ array [0])then 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

私はちょうど気づいた、これは私のせいですが、名前が与えられていないと文字通り言わないそのスペースと3つのカンマの名前を付けます。 ",,," – Trance339

+0

私は答えを更新しました。 – daxim

4

あなたは最終的には何の規則に従っていない何かを解析することができず、成功することを望みます。問題は、アルゴリズムを正規表現に変換するのではなく、まずアルゴリズムを記述することです。

考えてみましょう:これらの名前をGiven、Middle、およびFamilyの名前に正しく解析できるアルゴリズムを作成するにはどうすればよいですか?

  • ボブ・マックIntosh
  • メアリー・ジェーン・ワトソン
  • サーストン・パウエルIII
  • マイケル・ファン・デル・フェルデン
  • ジャクリーン・ケネディ・オナシス
  • 博士ジーン・グレイ
  • 高橋史朗
  • ミシェルラフォンテーヌ
  • のサーアレック・ギネス
  • メアリー・スー・ボウズ・リヨン
  • サシャ・バロン・コーエン
  • ジャック・アーノルド・ジュニア

は、私が何を意味するかを参照してください?これらの単語のそれぞれを適切なコンテキストに適切にチャンクするには、AIが必要です。一部の人は、「与えられた」名前として2つの名前を使用します。一部の人々は、タイトルや敬語を使用しています。また、文化によっては、最初に家族の名前を付けて最後に名前を付けるものもあります。

要約:しないでください。ユーザーに名前を特定のチャンクに分けることができない場合は、でアトムとして扱わなければなりません。