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)
你的原始代码很慢的原因是因为你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,用于指示复制的下一个字符应设置为大写.另请注意,我不会自动将整个字符串转换为小写.没有理由,因为无论如何你都会查看每个角色,并且可以在那时进行适当的转换.
这里的想法是代码不会做任何比绝对更多的工作.
为了完整起见,这里还有一个正则表达式单行(受此JavaScript 答案启发):
string ConvertDashToCamelCase(string input) =>
Regex.Replace(input, "-.", m => m.Value.ToUpper().Substring(1));
Run Code Online (Sandbox Code Playgroud)
它将所有出现的 替换-x为x转换为大写。
特别案例:
如果您想要小写所有其他字符,请在表达式中替换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)
| 归档时间: |
|
| 查看次数: |
1690 次 |
| 最近记录: |