[英]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.