2014-01-07 5 views
8

어떤 문자열이 주어지면 문자열을 나타내는 지적인 머리 글자 어를 만들려합니다. JIRA를 사용하신 분이라면 JIRA를 꽤 잘 수행 할 수 있습니다. 피닉스가 PHX 또는 주어진 단어 개인 정보 보호 이벤트 관리PEM을 만들 것입니다 생성 할 것입니다 : 단어 주어진 예를 들어C# Create

.

나는 후자를 달성하는 몇 가지 코드를 가지고 : 하나 하나 개의 단어와 소문자가있는 경우

string.Join(string.Empty, model.Name 
       .Where(char.IsLetter) 
       .Where(char.IsUpper)) 

이 경우는 처리하지 않습니다.

하지만 첫 번째 경우를 설명하지 않습니다. 어떤 아이디어? 나는 C# 4.5를 사용하고 있습니다.

+0

첫 번째 경우의 규칙은 무엇입니까? 항상 첫 번째, 두 번째, 마지막 숯? 그리고 이러한 경우를 구별하기위한 규칙은 무엇입니까? – okrumnow

+8

영어로 말하면서 딱딱한 소리가 나는 것 : NASA 나 Marvel의 SHIELD라고 발음하는 약어입니다. 그것들은 각 단어의 첫 글자를 취하고 그 단어 (CIA 또는 NSA와 같은)를 발음하지 않으면 한 단어를 짧게하면 (예 : 첫 번째 예 또는 EXT. 외장) 약어가됩니다. –

+0

@okrumnow 특정 규칙이 없으므로, 그냥 바람직한 결과의 예로서 사용했습니다. – amcdnl

답변

1

나는 JIRA 키 생성기를 추출 할 수 있었고 here이라고 게시했습니다. 꽤 흥미 롭다. JavaScript가 C#으로 쉽게 변환 될 수있다.

3

Phoenix => PHX의 경우, 문자열을 알려진 약어 사전으로 검사해야한다고 생각합니다. 여러 단어/낙타 - 케이스 지원에 관해서는, 정규 표현식은 당신의 친구입니다!

var text = "A Big copy DayEnergyFree good"; // abbreviation should be "ABCDEFG" 
var pattern = @"((?<=^|\s)(\w{1})|([A-Z]))"; 
string.Join(string.Empty, Regex.Matches(text, pattern).OfType<Match>().Select(x => x.Value.ToUpper())) 

여기서 부분적으로 일치하는 부분을 다루는 정규식 패턴부터 시작하여 설명합니다.

// must be directly after the beginning of the string or line "^" or a whitespace character "\s" 
(?<=^|\s) 
// match just one letter that is part of a word 
(\w{1}) 
// if the previous requirements are not met 
| 
// match any upper-case letter 
([A-Z]) 

Regex.Matches 방법은 기본적으로 너무 LINQ 표현식을 사용하는 ICollection에 인을 MatchCollection을 반환, 우리는 OfType()를 호출를 IEnumerable로을 MatchCollection를 변환합니다.

Regex.Matches(text, pattern).OfType<Match>() 

그런 다음 우리는 경기의 값을 선택 (우리가 다른 정규식 일치하는 메타 데이터를 필요로하지 않는 것) 대문자로 변환합니다.

Select(x => x.Value.ToUpper()) 
+0

와우 .. 그거 멋지다! 설명 주셔서 감사합니다! – amcdnl