2014-01-07 19 views
8

文字列を指定すると、文字列を表す頭字語を作成したいと思います。 JIRAを使用している人がいれば、これはかなりうまくいきます。それはPHXを生成したり、それがPEMを作成し単語プライバシーイベント管理を与えられたでしょうフェニックス:たとえばC#Create単語からの単語

は、言葉を与えられました。

私は後者を達成するいくつかのコードを持っている:

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

一つだけの単語とその下ケースのいずれかがある場合、この場合は処理されません。

ですが、最初のケースは説明しません。何か案は?私はC#4.5を使用しています

+0

最初のケースのルールは何ですか?常に最初、2番目、最後の文字ですか?これらのケースを区別するためのルールは何ですか? – 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

関連する問題