eg. if the Name is: John Deer
the Initials should be: JD
부분 문자열을 사용하여 이니셜 필드에서이 검사를 수행 할 수 있지만 정규 표현식을 쓸 수 있는지 궁금하십니까? 그리고 정규 표현식을 문자열 메소드를 사용하는 것보다 더 나은 아이디어로 작성하고 있습니까?이름에서 이니셜을 추출하는 정규식 이름
eg. if the Name is: John Deer
the Initials should be: JD
부분 문자열을 사용하여 이니셜 필드에서이 검사를 수행 할 수 있지만 정규 표현식을 쓸 수 있는지 궁금하십니까? 그리고 정규 표현식을 문자열 메소드를 사용하는 것보다 더 나은 아이디어로 작성하고 있습니까?이름에서 이니셜을 추출하는 정규식 이름
는 개인적으로, 나는 이니셜 처리 및 공백 제거를 취이 정규식
Regex initials = new Regex(@"(\b[a-zA-Z])[a-zA-Z]* ?");
string init = initials.Replace(nameString, "$1");
//Init = "JD"
선호합니다 (먹으 렴 '을?'끝에있다).
걱정할 필요가있는 것은 Jr.이나 Sr. 또는 Mrs .... 등의 제목과 문법입니다.어떤 사람들은 여기에 간단하게 유지에 중점을 둔 대안의 자신의 전체 이름
노력이 하나
(^|)([^ ])([^ ])*','\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)
}
중간 이름이 포함 된 경우 한 가지 문제가 있습니다. – kevlar1818
예, 정규식을 사용하십시오. Regex.Match 및 Regex.Match.Groups 메서드를 사용하여 일치하는 항목을 찾은 다음 필요한 일치하는 값 (이 경우에는 이니셜)을 추출 할 수 있습니다. 값을 찾고 추출하는 것은 동시에 일어날 것입니다. 당신에게 각 이름의 첫 두 글자를 그물 것
[a-z]+[a-z]+\b
...
그럼 당신은 분할 할 수 있습니다 '에'와 조인 '도
'제임스 헨리 조지 마이클 '='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]* ?
을 사용하여 이전 이름으로 바꿀 수 있습니다. 이것에 대해
방법은 :
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();
이 옵션 중간 이름을 허용하고, 위와 같이 여러 총액 작동합니다.
사람들을 포함 할 : 예상대로 제공하는 이름이없는 경우 무엇을해야하는지의 문제가있다
/// <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이 정말 데이터 정리 문제입니다 (예를 들어, 마지막 하나 더 나은 처리)이있을 것이다.
아주 멋지게 보입니다. C#에서 Regexes에 대한 치트 시트를 찾았습니다. btw : http://www.mikesdotnetting.com/article/46/c-regular-expressions-cheat-sheet –
내 해결책은 다음과 같습니다. 내 목표는 가장 단순한 솔루션을 제공하는 것이 아니라 다양한 (때로는 이상한) 이름 형식을 취할 수 있고 이름과 성 이니셜 (또는 익명의 사용자의 경우)에서 단일 이니셜을 가장 잘 추측 할 수있는 것입니다.
많은 외국 이름 (예 : 중국어)에 대한 이니셜 생성에 대한 경험이 없지만 비교적 국제 친화적 인 방식으로 유니 코드 정규식으로 작성하려고했습니다. 사람을 대표하는 데 사용할 수있는 것을 최소한 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();
}
Mason을 잘 수행했습니다. 영어로 된 이름에 대해서만 테스트를 진행했지만, 작동하고 다양한 시나리오를 다룹니다. – Aggromonster
éè ... "Stéphane Test " 그 문제가 없어도 잘 작동합니다 - caracter^_- – Danh
"set "을 수정해야합니다. 표준 52 자의 미국 영어 알파벳으로 작동하도록 배열했습니다. – Nevyn
마침표가있는 이니셜의 경우, Michael J. Jordan, "\."을 포함하도록 표현식을 업데이트 할 수 있습니다. 이 같은 것 "(\ b [a-zA-Z]) [a-zA-Z] * \. *?" – cecilphillip