2012-05-30 20 views
6
eg. if the Name is: John Deer 
the Initials should be: JD 

部分文字列を使用して、イニシャルフィールドでこのチェックを実行できますが、正規表現を書くことができますか?そして、正規表現を文字列メソッドを使って行うよりも良いアイデアを書いていますか?名前からイニシャルを抽出する正規表現

答えて

13

は個人的に、私は(厥「?」が最後に)イニシャルの世話をし、空白除去、この正規表現

Regex initials = new Regex(@"(\b[a-zA-Z])[a-zA-Z]* ?"); 
string init = initials.Replace(nameString, "$1"); 
//Init = "JD" 

を好みます。

あなたが心配しなければならないのは、Jr.やSr.、Mrs ....などのタイトルとパンクチュエーションだけです。

/// <summary> 
    /// Gets initials from the supplied names string. 
    /// </summary> 
    /// <param name="names">Names separated by whitespace</param> 
    /// <param name="separator">Separator between initials (e.g. "", "." or ". ") </param> 
    /// <returns>Upper case initials (with separators in between)</returns> 
    public static string GetInitials(string names, string separator) 
    { 
     // Extract the first character out of each block of non-whitespace 
     Regex extractInitials = new Regex(@"\s*([^\s])[^\s]*\s*"); 
     return extractInitials.Replace(names, "$1" + separator).ToUpper(); 
    } 

期待通りに指定する名前がない場合はどうするかの問題があります:一部の人々は

+0

éèのようなフランス語のキャラクターでは動作しないようです... 「StéphaneTest " この問題がなければ、 - caracter^_- – Danh

+0

を修正する必要があります。標準52文字のアメリカ英語アルファベットで動作するようにアレンジした「セット」を修正する必要があります。 – Nevyn

+0

ピリオドのあるイニシャルの場合、Michael J. Jordanの場合、式を更新して「\。」を含めることができます。このようなもの "(\ b [a-zA-Z])[a-zA-Z] * \。*?" – cecilphillip

0

はこれについて、この1

(^|)([^ ])([^ ])*','\2') 

またはこの1

public static string ToInitials(this string str) 
    { 
     return Regex.Replace(str, @"^(?'b'\w)\w*,\s*(?'a'\w)\w*$|^(?'a'\w)\w*\s*(?'b'\w)\w*$", "${a}${b}", RegexOptions.Singleline) 
    } 

http://www.kewney.com/posts/software-development/using-regular-expressions-to-get-initials-from-a-string-in-c-sharp

+0

これらの問題の1つは、ミドルネームが含まれている場合です。 – kevlar1818

2

どのようにしてみては?

var initials = Regex.Replace("John Deer", "[^A-Z]", ""); 
+0

ハリード・マクドナルドがHMDとして出てくるのを忘れないでください。 – IanNorton

+0

名前が大文字である場合にのみ働きます... – Jay

0

はい、正規表現を使用してください。 Regex.MatchメソッドとRegex.Match.Groupsメソッドを使用して一致を見つけ、必要な一致する値(この場合は頭文字)を抽出することができます。値の検索と抽出は同時に行われます。

0

[a-z]+[a-z]+\bあなたにそれぞれの名前の最初の2つの文字を正味ます...

名=「グレッグ・ヘンリー」=「GH」または「ジェームズ・スミス」「のJS」

次にあなたが分割することができます「オン」との参加「」でも

「ジェームズ・ヘンリー・ジョージ・マイケル」=「JHGM」

「ジェームズ・ヘンリーのような名前に取り組んでいます。この

をジョージ・マイケルIII秒」= 『JHGM III』

あなたは分割が[a-z]+[a-z]+\b ?

を利用避けたいしかし、その後Jon Michael Jr. The 3rdのような名前は=上記のオプションは、あなたが得ることを可能にするようJMJr.T3になる場合 『』を、あなたが望んでいれば 'the'と '3rd'。

(\b[a-zA-Z])[a-zA-Z]* ?を使用して名前の一部と一致させてから置き換えることができます。

0

これはどう:

 string name = "John Clark MacDonald"; 
     var parts = name.Split(' '); 
     string initials = ""; 

     foreach (var part in parts) 
     { 
      initials += Regex.Match(part, "[A-Z]"); 
      Console.WriteLine(part + " --> " + Regex.Match(part,"[A-Z]")); 
     } 
     Console.WriteLine("Final initials: " + initials); 
     Console.ReadKey(); 

これはオプションのミドルネームを可能にし、そして上記のように、複数の総額のために働きます。

1

ここではそれをシンプルに保つことに重点を置いた代替だフルネームのものが含まれません。個人的には、空白ではないテキストの各塊から最初の文字を返すべきだと思います。例えば:

1Steve 2Chambers    => 12 
harold mcDonald    => HM 
David O'Leary     => DO 
David O' Leary     => DOL 
Ronnie "the rocket" O'Sullivan => R"RO 

より洗練された/複雑な技術を主張したい方には、しかし、IMO、これは実際にデータクレンジングの問題である(例えば、最後の1よりよく処理するために)があります。

+0

とても素敵です。私はC#のRegexesのチートシートを見つけました。btw: http://www.mikesdotnetting.com/article/46/c-regular-expressions-cheat-sheet –

13

私の解決策です。私の目標は、最も簡単な解決法を提供するのではなく、いろいろな(時には奇妙な)名前フォーマットをとり、名字(あるいは無名の人物の場合)の頭文字をとって一番最初に推測することでした。

私は多国籍の外国語(例えば中国語)のイニシャルを作成する経験はありませんが、比較的国際的に優しい方法で、ユニコードの正規表現で書いてみました。人を表現するために使用できるものを少なくとも2文字以内で生成する。たとえば、「行運の服馬」のように韓国語で名前をつけても、あなたが期待していたように、幸福をもたらすでしょう(しかし、それは韓国の文化では正しいことではないかもしれません)。

/// <summary> 
/// Given a person's first and last name, we'll make our best guess to extract up to two initials, hopefully 
/// representing their first and last name, skipping any middle initials, Jr/Sr/III suffixes, etc. The letters 
/// will be returned together in ALL CAPS, e.g. "TW". 
/// 
/// The way it parses names for many common styles: 
/// 
/// Mason Zhwiti    -> MZ 
/// mason lowercase zhwiti  -> MZ 
/// Mason G Zhwiti    -> MZ 
/// Mason G. Zhwiti    -> MZ 
/// John Queue Public   -> JP 
/// John Q. Public, Jr.   -> JP 
/// John Q Public Jr.   -> JP 
/// Thurston Howell III   -> TH 
/// Thurston Howell, III  -> TH 
/// Malcolm X     -> MX 
/// A Ron      -> AR 
/// A A Ron      -> AR 
/// Madonna      -> M 
/// Chris O'Donnell    -> CO 
/// Malcolm McDowell   -> MM 
/// Robert "Rocky" Balboa, Sr. -> RB 
/// 1Bobby 2Tables    -> BT 
/// Éric Ígor     -> ÉÍ 
/// 행운의 복숭아     -> 행복 
/// 
/// </summary> 
/// <param name="name">The full name of a person.</param> 
/// <returns>One to two uppercase initials, without punctuation.</returns> 
public static string ExtractInitialsFromName(string name) 
{ 
    // first remove all: punctuation, separator chars, control chars, and numbers (unicode style regexes) 
    string initials = Regex.Replace(name, @"[\p{P}\p{S}\p{C}\p{N}]+", ""); 

    // Replacing all possible whitespace/separator characters (unicode style), with a single, regular ascii space. 
    initials = Regex.Replace(initials, @"\p{Z}+", " "); 

    // Remove all Sr, Jr, I, II, III, IV, V, VI, VII, VIII, IX at the end of names 
    initials = Regex.Replace(initials.Trim(), @"\s+(?:[JS]R|I{1,3}|I[VX]|VI{0,3})$", "", RegexOptions.IgnoreCase); 

    // Extract up to 2 initials from the remaining cleaned name. 
    initials = Regex.Replace(initials, @"^(\p{L})[^\s]*(?:\s+(?:\p{L}+\s+(?=\p{L}))?(?:(\p{L})\p{L}*)?)?$", "$1$2").Trim(); 

    if (initials.Length > 2) 
    { 
     // Worst case scenario, everything failed, just grab the first two letters of what we have left. 
     initials = initials.Substring(0, 2); 
    } 

    return initials.ToUpperInvariant(); 
} 
+0

非常によく行われたMason。私は英語の名前に対してのみテストしていましたが、動作し、さまざまなシナリオをカバーしています。 – Aggromonster