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

在C#中用大写字母创建首字母缩写词的最佳方法是什么?

示例

Alfa_BetaGameDelta_Epsilon

预期结果

ABGDE

我的解决方案有效,但并不好

  var classNameAbbreviationRegex = new Regex("[AZ]+", 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); 

 string.Join("", s.Where(char.IsUpper)); 
 string.Join("", s.Where(x => char.IsUpper(x)) 
 string test = "Alfa_BetaGameDelta_Epsilon"; string result = string.Concat(test.Where(char.IsUpper)); 

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

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

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

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

更多的正则表达式始终是解决方案,尤其是LINQ! 🙂

正则表达式将所有[AZ]放在捕获组1中(因为所有其他()都是非捕获组(?:) )并且“跳过”所有非[AZ][^AZ] )将它们放入非捕获组。 这是由最后一个*完成0次无限次。 然后用一点LINQ来选择每个捕获的值。选择.Select(p => p.Value)string.Join来加入它们。

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

(是的,这是无用的…使用LINQ + IsUpper的其他方法更好:-)但整个示例只是为了显示使用Unicode的Regexes的问题而构建

更容易:

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

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

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