5

C#で大文字から頭字語を作成する最良の方法は何ですか?

Alfa_BetaGameDelta_Epsilon

期待される結果:

ABGDE

私のソリューションは機能しますが、良くありません

        var classNameAbbreviationRegex = new Regex("[A-Z]+", RegexOptions.Compiled);
        var matches = classNameAbbreviationRegex.Matches(enumTypeName);
        var letters = new string[matches.Count];

        for (var i = 0; i < matches.Count; i++)
        {
            letters[i] = matches[i].Value;
        }

        var abbreviation = string.Join(string.Empty, letters);
4

6 に答える 6

3

MORE正規表現を使用して:-)

var ac = string.Join(string.Empty, 
                     Regex.Match("Alfa_BetaGameDelta_Epsilon", 
                                 "(?:([A-Z]+)(?:[^A-Z]*))*")
                          .Groups[1]
                          .Captures
                          .Cast<Capture>()
                          .Select(p => p.Value));

特に LINQ を使用する場合は、より多くの正規表現が常に解決策になります。:-)

正規表現は、すべて[A-Z]をキャプチャ グループ 1 に入れ (他のすべて()は非キャプチャ グループであるため)、すべての非( ) を非キャプチャ グループに入れることで(?:)「スキップ」します。これは、最後の によって 0-無限回行われます。次に、各キャプチャの値を選択し、それらを結合するための小さなLINQ 。[A-Z][^A-Z]*.Select(p => p.Value)string.Join

これは Unicode フレンドリーではないことに注意してください... ÀÈÌÒÙ は無視されます。@"(?:(\p{Lu}+)(?:[^\p{Lu}]*))*"where \p{Lu}is the Unicode category UppercaseLetter .

(はい、これは役に立ちません... LINQ+を使用する他の方法のIsUpper方が優れています :-) しかし、例全体は、Unicode を使用した正規表現の問題を示すためだけに作成されました)

はるかに簡単:

var ac = Regex.Replace("Alfa_BetaGameDelta_Epsilon", @"[^\p{Lu}]", string.Empty);

大文字以外の文字をすべて削除するだけです:-)

于 2013-08-08T12:27:27.547 に答える