字符串小替换

时间:2016-10-10 08:26:49

标签: c# string

我正在寻找一种简单的方法来从字符串中删除下划线并用大写字母替换下一个字符。

例如:

From: "data" to: "Data"
From: "data_first" to: "DataFirst"
From: "data_first_second" to: "DataFirstSecond"

6 个答案:

答案 0 :(得分:3)

这种方法被称为"有限状态机"迭代字符串 - 因为它有一组有限的状态("是一个单词的第一个字母跟在下划线" 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();
}

答案 1 :(得分:3)

谁需要多行代码?

var output = Regex.Replace(input, "(?:^|_)($|.)", m => m.Groups[1].Value.ToUpper());

答案 2 :(得分:0)

我会做这样的事情:

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

答案 3 :(得分:0)

您可以使用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);

答案 4 :(得分:0)

所有其他答案都有效......以文化意识的方式:

var textInfo = CultureInfo.CurrentCulture.TextInfo;
var modifiedString = textInfo.ToTitleCase(originalString).Replace("_","")

我做了一个小提琴:https://dotnetfiddle.net/NAr5PP

答案 5 :(得分:0)

使用这样的LINQ和Split方法:

var result = string.Join("",str.Split('_')
             .Select(c => c.First().ToString()
             .ToUpper() + String.Join("", c.Skip(1))));