你的代码似乎已经给出了预期的结果。你想改进哪一部分?
我认为这不是你所需要的答案。但我只想分享我将如何解决这个问题,我不使用linq/regex,而只是检查字符串中的每个字符的内存效率(没有linq/regex库)。我想在这个过程中它也应该更轻一些。但请注意,这可能不容易阅读。
public static string ToJsonIdentifier(string s)
{
// special case, s is empty
if (string.IsNullOrEmpty(s)) return s;
var result = new StringBuilder();
bool isFirst = true; // Is First (non-whitespace) Character Flag
bool isSpace = false; // Is Whitespace Flag
bool isUpperCase = false; // Is Uppercase Flag
foreach(char c in s)
{
// filter to be letter or digit only
if(!char.IsLetterOrDigit(c))
{
continue;
}
if(isFirst)
{
if (!char.IsWhiteSpace(c))
{
// if first character, set to lower case
result.Append(char.ToLower(c));
isFirst = false; // no more first flag
}
// if WhiteSpace, ignore the character
}
else if(char.IsWhiteSpace(c))
{
isSpace = true; // set the Whitespace flag, so next char should be uppercase
}
else if(char.IsUpper(c))
{
if (!isUpperCase)
{
// if previous char is lower case, set it as it is (as uppercase)
result.Append(c);
isUpperCase = true;
}
else
{
// if previous char is uppercase, set this to lower instead
result.Append(char.ToLower(c));
// and keep the uppercase flag on, so multiple uppercase in the row will be converted to lower, until lower case is found.
}
}
else if(char.IsLower(c))
{
if(isSpace) // if previous char is whitespace, set char to be upper case
{
isSpace = false; // no more whitespace flag
result.Append(char.ToUpper(c));
isUpperCase = true; // set upper case flag on
}
else
{
isUpperCase = false; // no more upper case flag
result.Append(c);
}
}
else if(char.IsDigit(c))
{
// reset all flags
isSpace = false;
isUpperCase = false;
result.Append(c);
}
}
return result.ToString();
}