2012-05-30 3 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 .... 등의 제목과 문법입니다.어떤 사람들은 여기에 간단하게 유지에 중점을 둔 대안의 자신의 전체 이름

+0

éè ... "Stéphane Test " 그 문제가 없어도 잘 작동합니다 - caracter^_- – Danh

+0

"set "을 수정해야합니다. 표준 52 자의 미국 영어 알파벳으로 작동하도록 배열했습니다. – Nevyn

+0

마침표가있는 이니셜의 경우, Michael J. Jordan, "\."을 포함하도록 표현식을 업데이트 할 수 있습니다. 이 같은 것 "(\ b [a-zA-Z]) [a-zA-Z] * \. *?" – cecilphillip

2

방법에 대해?

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

그 스코트를 잊지 마세요. Harrold McDonnald가 HMD로 나오게됩니다 – IanNorton

+0

이름이 대문자 인 경우에만 작동합니다 ... – Jay

0

예, 정규식을 사용하십시오. Regex.Match 및 Regex.Match.Groups 메서드를 사용하여 일치하는 항목을 찾은 다음 필요한 일치하는 값 (이 경우에는 이니셜)을 추출 할 수 있습니다. 값을 찾고 추출하는 것은 동시에 일어날 것입니다. 당신에게 각 이름의 첫 두 글자를 그물 것

0

[a-z]+[a-z]+\b ...

하는 이름 = '그렉 헨리'= '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

사람들을 포함 할 : 예상대로 제공하는 이름이없는 경우 무엇을해야하는지의 문제가있다

/// <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(); 
    } 

. 개인적으로 공백이 아닌 텍스트의 각 청크에서 첫 번째 문자를 반환해야한다고 생각합니다. 예컨대 :

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

보다 정교한/복합 기술에 대한 주장 줄 사람은 그러나 IMO이 정말 데이터 정리 문제입니다 (예를 들어, 마지막 하나 더 나은 처리)이있을 것이다.

+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

관련 문제