12
eg. if the Name is: John Deer
the Initials should be: JD

部分文字列を使用して Initials フィールドでこのチェックを実行できますが、正規表現を記述できるかどうか疑問に思っていますか? また、文字列メソッドを使用するよりも、正規表現を作成する方がよいのでしょうか?

4

11 に答える 11

23

これが私の解決策です。私の目標は、最も単純な解決策を提供することではなく、さまざまな (場合によっては奇妙な) 名前形式を取り、姓名のイニシャル (または単名の人の場合) 1 つのイニシャルで最適な推測を生成できるソリューションを提供することでした。

また、ユニコード正規表現を使用して、比較的国際的にフレンドリーな方法で記述しようとしましたが、多くの種類の外国の名前 (中国語など) のイニシャルを生成した経験はありませんが、少なくとも使用可能なものを生成する必要があります。 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();
}
于 2015-02-06T19:36:43.113 に答える
2

これはどう?

var initials = Regex.Replace( "John Deer", "[^A-Z]", "" );
于 2012-05-30T16:25:15.473 に答える
0

これを試してみてください

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

またはこれ

 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

于 2012-05-30T16:25:06.007 に答える
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();

これにより、オプションのミドル ネームが可能になり、上記のように複数の大文字で機能します。

于 2012-05-30T17:25:10.457 に答える
0

[a-z]+[a-z]+\bそれぞれの名前の最初の 2 文字...

name = 'Greg Henry' = 'G H' または 'James Smith' 'J S'

次に、「 」で分割し、「」で参加できます

これは、次のような名前でも機能します

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

「ジェームス ヘンリー ジョージ マイケル 3 世 2 世」 = 「JHGM III」

分割を回避したい場合は利用してください[a-z]+[a-z]+\b ?

ただし、次のような名前Jon Michael Jr. The 3rdは =JMJr.T3になります。上記のオプションを使用すると、必要に応じて「The」、「the」、および「3rd」を取得できます..

本当に派手にしたい場合は、 を使用し(\b[a-zA-Z])[a-zA-Z]* ?て名前の一部だけを一致させてから、前者に置き換えることができます。

于 2012-05-30T16:31:18.907 に答える
-1

はい、正規表現を使用します。Regex.MatchメソッドとRegex.Match.Groupsメソッドを使用して、一致するものを見つけてから、必要な一致する値(この場合はイニシャル)を抽出できます。値の検索と抽出は同時に行われます。

于 2012-05-30T16:26:02.947 に答える