有没有更好的方法从C#中的大写字母创建首字母缩略词?

时间:2013-08-08 12:13:25

标签: c# regex acronym

在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);

6 个答案:

答案 0 :(得分:5)

string.Join("", s.Where(x => char.IsUpper(x))

答案 1 :(得分:5)

string.Join("", s.Where(char.IsUpper));

答案 2 :(得分:5)

string test = "Alfa_BetaGameDelta_Epsilon";
string result = string.Concat(test.Where(char.IsUpper));

答案 3 :(得分:3)

您可以使用Where方法过滤掉大写字符,Char.IsUpper方法可以直接用作委托,而不需要lambda表达式。您可以从一个字符数组创建结果字符串:

string abbreviation = new String(enumTypeName.Where(Char.IsUpper).ToArray());

答案 4 :(得分:3)

使用更多正则表达式: - )

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(因为所有其他()都是非捕获组(?:))并“跳过”所有非[A-Z][^A-Z])将它们放入非捕获组。这是由最后一个*完成0次无限次。然后用一点LINQ来选择每个捕获.Select(p => p.Value)string.Join的值来加入它们。

请注意,这不是Unicode友好的...ÀÈÌÒÙ将被忽略。更好的正则表达式将使用@"(?:(\p{Lu}+)(?:[^\p{Lu}]*))*",其中\p{Lu}是Unicode类别UppercaseLetter。

(是的,这是无用的......使用LINQ + IsUpper的其他方法更好:-)但整个示例只是为了显示带有Unicode的正则表达式的问题而存在< / p>

更容易:

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

只需删除所有非大写字母: - )

答案 5 :(得分:2)

var str = "Alfa_BetaGammaDelta_Epsilon";
var abbreviation = string.Join(string.Empty, str.Where(c => c.IsUpper()));