2014-01-07 43 views
8

鑑於任何字符串,我想創建一個代表字符串的智能首字母縮寫詞。如果您有任何人使用JIRA,他們完成這個很好。C#Create Word的首字母縮寫

例如,所給詞:鳳凰它會產生PHX或所給詞隱私事件管理它會造成PEM

我有一些代碼,將實現後者:

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

這種情況下,如果只有一個詞,其較低的情況下,或者不處理。

但它沒有考慮到第一種情況。有任何想法嗎?我正在使用C#4.5

+0

第一種情況的規則是什麼?總是第一,第二,最後一個字符?區分這些情況的規則是什麼? – okrumnow

+8

只是一些英語nitpicking:這是一個縮寫,如果它的發音(美國宇航局,或漫威的盾牌)。如果您從每個單詞中取出第一個字母但不發音(如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方法返回MatchCollection,這基本上是一個ICollection的如此使用LINQ表達式,我們稱之爲OfType()到MatchCollection轉換成一個IEnumerable。

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

然後我們選擇比賽才值(我們不需要其他的正則表達式匹配的元數據),並將其轉換爲大寫。

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

哇.. 。 那很棒!感謝您的解釋! – amcdnl