有没有更好的方法从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()));