簡體   English   中英

通過 C# 將破折號分隔的字符串轉換為駝峰式大小寫

[英]Convert Dash-Separated String to camelCase via C#

我有一個包含實現破折號分隔命名約定的標簽名稱的大型 XML 文件。 如何使用 C# 將標簽名稱轉換為駝峰命名約定?

規則是: 1. 將所有字符轉換為小寫 2. 每個破折號的第一個字符大寫 3. 刪除所有破折號

轉換前示例

<foo-bar>
 <a-b-c></a-b-c>
</foo-bar>

轉換后

<fooBar>
 <aBC></aBC>
</fooBar>

這是一個有效的代碼示例,但處理速度很慢 - 我認為有更好的方法來實現我的目標。

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();
}

您的原始代碼很慢的原因是因為您不必要地到處調用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();
}

我不會聲稱以上是最快的。 事實上,有幾個明顯的優化可以節省一些時間。 但上面的內容很清晰:易於理解。

關鍵是caseFlag ,它用於指示復制的下一個字符應設置為大寫。 另請注意,我不會自動將整個字符串轉換為小寫。 沒有理由這樣做,因為無論如何您都會查看每個字符並且可以在那時進行適當的轉換。

這里的想法是代碼不會做比它絕對必須做的更多的工作。

string ConvertDashToCamelCase(string input)
{
    string[] words = input.Split('-');

    words = words.Select(element => wordToCamelCase(element));

    return string.Join("", words);
}

string wordToCamelCase(string input)
{
    return input.First().ToString().ToUpper() + input.Substring(1).ToLower();
}

為了完整起見,這里還有一個正則表達式單行(由這個 JavaScript 答案解釋):

string ConvertDashToCamelCase(string input) =>
    Regex.Replace(input, "-.", m => m.Value.ToUpper().Substring(1));

它將所有出現的-x替換為轉換為大寫的x


特別案例:

  • 如果你想小寫所有其他字符,用input.ToLower()在表達式中替換input

     string ConvertDashToCamelCase(string input) => Regex.Replace(input.ToLower(), "-.", m => m.Value.ToUpper().Substring(1));
  • 如果你想支持的話(之間的多個破折號dash--case ),並具有全部拆除(破折號的dashCase ),替換--+正則表達式(貪婪地匹配短線的所有序列),只保留最后一個字符:

     string ConvertDashToCamelCase(string input) => Regex.Replace(input, "-+.", m => m.Value.ToUpper().Substring(m.Value.Length - 1));
  • 如果您想支持單詞之間的多個破折號 ( dash--case ) 並僅刪除最后一個 ( dash-Case ),請更改正則表達式以僅匹配破折號后跟非破折號(而不是破折號后跟任何特點):

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

這是@Jim Mischel 答案的更新版本,它將忽略內容 - 即它只會使用駝峰命名法標記名稱。

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

        // Reset tag flag if necessary
        if(c == '>' || c == '<')
        {
            tagFlag = (c == '<');
        }

    }
    return sb.ToString();
}
using System;
using System.Text;

public class MyString
{
  public static string ToCamelCase(string str)
  {
    char[] s = str.ToCharArray();
    StringBuilder sb = new StringBuilder();
    for(int i = 0; i < s.Length; i++)
    {
      if (s[i] == '-' || s[i] == '_')
        sb.Append(Char.ToUpper(s[++i]));
      else
        sb.Append(s[i]);
    }
    return sb.ToString();
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM