通过C#将Dash-Separated String转换为camelCase

Jed*_*Jed 1 c# regex string-conversion

我有一个大型XML文件,其中包含实现以虚线分隔的命名约定的标记名称.如何使用C#将标记名称转换为驼峰大小写命名约定?

规则如下:1.将所有字符转换为小写2.将每个破折号的第一个字符大写3.删除所有破折号

转换前的示例

<foo-bar>
 <a-b-c></a-b-c>
</foo-bar>
Run Code Online (Sandbox Code Playgroud)

转换后

<fooBar>
 <aBC></aBC>
</fooBar>
Run Code Online (Sandbox Code Playgroud)

这是一个有效的代码示例,但处理速度很慢 - 我认为有更好的方法来实现我的目标.

string ConvertDashToCamelCase(string input)
{
    input = input.ToLower();
    char[] ca = input.ToCharArray();
    StringBuilder sb = new StringBuilder();

    for(int i = 0; i < ca.Length; i++)
    {
        if(ca[i] == '-')
        {
            string t = ca[i + 1].ToString().toUpper();
            sb.Append(t);
            i++;
        }
        else
        {
            sb.Append(ca[i].ToString());
        }
    }

    return sb.ToString();
}
Run Code Online (Sandbox Code Playgroud)

Jim*_*hel 5

你的原始代码很慢的原因是因为你ToString不必要地在整个地方打电话.没有必要这样做.也没有必要使用中间数组char.以下应该比使用的版本更快,更快String.Split.

string ConvertDashToCamelCase(string input)
{
    StringBuilder sb = new StringBuilder();
    bool caseFlag = false;
    for (int i = 0; i < input.Length; ++i)
    {
        char c = input[i];
        if (c == '-')
        {
            caseFlag = true;
        }
        else if (caseFlag)
        {
            sb.Append(char.ToUpper(c));
            caseFlag = false;
        }
        else
        {
            sb.Append(char.ToLower(c));
        }
    }
    return sb.ToString();
}
Run Code Online (Sandbox Code Playgroud)

我不会声称以上是最快的.事实上,有几个明显的优化可以节省一些时间.但以上内容清晰明了:易于理解.

键是caseFlag,用于指示复制的下一个字符应设置为大写.另请注意,我不会自动将整个字符串转换为小写.没有理由,因为无论如何你都会查看每个角色,并且可以在那时进行适当的转换.

这里的想法是代码不会做任何比绝对更多的工作.


Hei*_*nzi 5

为了完整起见,这里还有一个正则表达式单行(受此JavaScript 答案启发):

string ConvertDashToCamelCase(string input) =>
    Regex.Replace(input, "-.", m => m.Value.ToUpper().Substring(1));
Run Code Online (Sandbox Code Playgroud)

它将所有出现的 替换-xx转换为大写。


特别案例:

  • 如果您想要小写所有其他字符,请在表达式中替换input为:input.ToLower()

      string ConvertDashToCamelCase(string input) =>
          Regex.Replace(input.ToLower(), "-.", m => m.Value.ToUpper().Substring(1));
    
    Run Code Online (Sandbox Code Playgroud)
  • 如果要支持单词之间存在多个破折号 ( dash--case) 并删除所有破折号 ( dashCase),请在正则表达式中替换--+(以贪婪地匹配所有破折号序列)并仅保留最后一个字符:

      string ConvertDashToCamelCase(string input) =>
          Regex.Replace(input, "-+.", m => m.Value.ToUpper().Substring(m.Value.Length - 1));
    
    Run Code Online (Sandbox Code Playgroud)
  • 如果您希望支持单词之间存在多个破折号 ( dash--case) 并仅删除最后一个破折号 ( dash-Case),请更改正则表达式以仅匹配破折号后跟非破折号(而不是破折号后跟任何字符):

      string ConvertDashToCamelCase(string input) =>
          Regex.Replace(input, "-[^-]", m => m.Value.ToUpper().Substring(1));
    
    Run Code Online (Sandbox Code Playgroud)