用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);
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",
"(?:([A-Z]+)(?:[^A-Z]*))*")
.Groups[1]
.Captures
.Cast<Capture>()
.Select(p => p.Value));
更多的正则表达式总是解决方案,尤其是使用LINQ!:-)
正则表达式将所有[A-Z]
放在捕获组1中(因为所有其他()
都是非捕获组(?:)
),并通过将它们放在非捕获组中来"跳过"所有非[A-Z]
([^A-Z]
)。这由最后一个*
完成0次无限次。然后用一点LINQ来选择每个捕获值CCD_ 11和CCD_。
请注意,这对Unicode不友好。。。"将被忽略。一个更好的正则表达式将使用@"(?:(p{Lu}+)(?:[^p{Lu}]*))*"
,其中p{Lu}
是Unicode类别UppercaseRetter。
(是的,这没用…其他使用LINQ
+IsUpper
的方法更好:-)但整个示例只是为了显示Regex与Unicode的问题而构建的)
更容易:
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()));