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

5
string test = "Alfa_BetaGameDelta_Epsilon";
string result = string.Concat(test.Where(char.IsUpper));
于 2013-08-08T12:18:45.603 回答
5
string.Join("", s.Where(x => char.IsUpper(x))
于 2013-08-08T12:16:10.953 回答
5
string.Join("", s.Where(char.IsUpper));
于 2013-08-08T12:16:32.650 回答
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 友好的... ÀÈÌÒÙ 将被忽略。更好的正则表达式将使用Unicode 类别大写字母@"(?:(\p{Lu}+)(?:[^\p{Lu}]*))*"where is。\p{Lu}

(是的,这是没用的......使用LINQ+的其他方法IsUpper更好:-) 但整个示例只是为了展示 Unicode 正则表达式的问题)

更容易:

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

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

于 2013-08-08T12:27:27.547 回答
3

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

string abbreviation = new String(enumTypeName.Where(Char.IsUpper).ToArray());
于 2013-08-08T12:19:30.480 回答
2
var str = "Alfa_BetaGammaDelta_Epsilon";
var abbreviation = string.Join(string.Empty, str.Where(c => c.IsUpper()));
于 2013-08-08T12:16:35.773 回答