串小更换
本文关键字: | 更新日期: 2023-09-27 18:12:33
我正在寻找一种简单的方法来从字符串中删除下划线并将下一个字符替换为大写字母。
例如:From: "data" to: "Data"
From: "data_first" to: "DataFirst"
From: "data_first_second" to: "DataFirstSecond"
谁需要多行代码?
var output = Regex.Replace(input, "(?:^|_)($|.)", m => m.Groups[1].Value.ToUpper());
这种方法被称为"有限状态机",它遍历字符串——因为它具有有限的状态集("是单词中下划线"vs"字符后面的单词的第一个字母")。这表示执行任务所需的最少指令。您可以使用正则表达式实现相同的效果,但它在运行时至少会生成相同数量的指令。手动编写代码可以保证最小的运行时间。
这种方法的优点是纯粹的性能:没有执行不必要的中间字符串分配,并且它只迭代一次输入字符串,时间复杂度为O(n),空间复杂度为O(n)。这是无法改进的。
public static String ConvertUnderscoreSeparatedStringToPascalCase(String input) {
Boolean isFirstLetter = true;
StringBuilder output = new StringBuilder( input.Length );
foreach(Char c in input) {
if( c == '_' ) {
isFirstLetter = true;
continue;
}
if( isFirstLetter ) {
output.Append( Char.ToUpper( c ) );
isFirstLetter = false;
}
else {
output.Append( c );
}
}
return output.ToString();
}
您可以使用String.Split
和以下LINQ查询:
IEnumerable<string> newStrings = "data_first_second".Split('_')
.Select(t => new String(t.Select((c, index) => index == 0 ? Char.ToUpper(c) : c).ToArray()));
string result = String.Join("", newStrings);
所有其他答案都有效…对于具有文化意识的方式:
var textInfo = CultureInfo.CurrentCulture.TextInfo;
var modifiedString = textInfo.ToTitleCase(originalString).Replace("_","")
我已经做了一个小提琴:https://dotnetfiddle.net/NAr5PP
我会这样做:
string test = "data_first_second";
string[] testArray=test.Split('_');
StringBuilder modifiedString = new StringBuilder();
foreach (string t in testArray)
{
modifiedString.Append(t.First().ToString().ToUpper() + t.Substring(1));
}
test=modifiedString.toString();
这样使用LINQ和Split
方法:
var result = string.Join("",str.Split('_')
.Select(c => c.First().ToString()
.ToUpper() + String.Join("", c.Skip(1))));