C# 用下一行的大写字母替换字符串中的字符(Pascal大小写)

C# 用下一行的大写字母替换字符串中的字符(Pascal大小写),c#,string,replace,replacewith,C#,String,Replace,Replacewith,我想删除下划线后面带有大写字符的字符串中的所有下划线。例如:\u我的字符串变成:MyString类似地:myu字符串变成MyString 有没有更简单的方法?我目前有以下内容(假设没有输入有两个连续的下划线): 采用的方法: Stopwatch stp = new Stopwatch(); stp.Start(); for (int i = 0; i < 1000000; i++) { sb = Tes

我想删除下划线后面带有大写字符的字符串中的所有下划线。例如:
\u我的字符串
变成:
MyString
类似地:
myu字符串
变成
MyString

有没有更简单的方法?我目前有以下内容(假设没有输入有两个连续的下划线):

采用的方法:

        Stopwatch stp = new Stopwatch();
        stp.Start();
        for (int i = 0; i < 1000000; i++)
        {
            sb = Test("_my_string_121_a_");
        }
        stp.Stop();
        long timeConsumed= stp.ElapsedMilliseconds;
Stopwatch stp=新秒表();
stp.Start();
对于(int i=0;i<1000000;i++)
{
sb=测试(“我的字符串”121“a”);
}
stp.Stop();
长时间消耗=stp.ElapsedMilliseconds;

最后,我想我将使用Raj的实现,因为它非常简单,易于理解

你需要将蛇壳转换成骆驼壳,你可以使用这段代码,它对我有用

  var x ="_my_string_".Split(new[] {"_"}, StringSplitOptions.RemoveEmptyEntries)
                .Select(s => char.ToUpperInvariant(s[0]) + s.Substring(1, s.Length - 1))
                .Aggregate(string.Empty, (s1, s2) => s1 + s2);
x=MyString

这必须使用
System.Globalization
名称空间来完成

static string toCamel(string input)
{        
    TextInfo info = CultureInfo.CurrentCulture.TextInfo;
    input= info.ToTitleCase(input).Replace("_", string.Empty);
    return input;
} 
尝试使用正则表达式:

var regex = new Regex("^[a-z]|_[a-z]?");
var result = regex.Replace("my_string_1234", x => x.Value== "_" ? "" : x.Value.Last().ToString().ToUpper());
通过以下方式进行测试:

my_string   -> MyString
_my_string  -> MyString
_my_string_ -> MyString
更短(正则表达式),但我怀疑它是否更好(正则表达式可读性较差):


在每个字符上循环并根据需要转换为大写

public string GetNewString(string input)
{
    var convert = false;
    var sb = new StringBuilder();

    foreach (var c in input)
    {
        if (c == '_')
        {
            convert = true;
            continue;
        }

        if (convert)
        {
            sb.Append(char.ToUpper(c));
            convert = false;
            continue;
        }

        sb.Append(c);
    }

    return sb.ToString().First().ToString().ToUpper() + sb.ToString().Substring(1);
}
用法:

GetNewString("my_string");
GetNewString("___this_is_anewstring_");
GetNewString("___this_is_123new34tring_");
输出:

MyString
这是一个新的字符串
这是123新的34字符串

静态字符串到名称(字符串输入)
{
StringBuilder sb=新的StringBuilder();
int i;
对于(i=0;i0&&input[i-1]=='''.'))
sb.Append(char.ToUpper(输入[i]);
其他的
sb.Append(char.ToLower(输入[i]);
}
使某人返回字符串();
}


这可能是当前的问题,因为
\u my\u string\u
会让您在最后一个
\u
之后查找字符,但不会。我一直循环到长度-1。我的错,没有发现:P@Achilles让我知道我的解决方案是否对您有效。。如果不是你要的,我至少可以删除。有些新手从来都不懂这个问题,但却抱怨逻辑。@rajshekarredy似乎适合我。我正在测试它。但这不是问题,如果字符串是“hello\u mynameis\u john”,结果将是“helloMynameisJohn”@AlfieGoodacre
。\u my\u字符串变成:MyString
是预期结果。上面的代码是正确的,但它没有实现所要求的实际功能。这就像我说我不想删除任何字符串中的第五个字符,并向您展示
string input=“1234 678”,然后您向我提供代码
输入。替换(“,”)@AlfieGoodacre你知道OP是否可以同时包含多个单词吗?我不认为OP会这么说……不,但我清楚地看到了这一点,这表明了同样的情况。“我想删除下划线后面带有大写字符的字符串中的所有下划线。”为什么要使用可选组?为什么不匹配一个小写字母并将其捕获到组1中?此外,短正则表达式模式非常可读。@Wiktor Stribiżew:我必须移除所有的底镜,无论它们后面是否有字母(例如尾部一个)。我相信您仍然可以像
@“+()”
那样增强它,并将
源代码。TrimEnd(“')
传递给正则表达式。@Wiktor Stribiżew:谢谢您的改进!我认为正则表达式后面的替换(““,”)
将同时执行
\u12
大小写和尾部
\ucode>@achiles:toCamel
的预期行为;对于
toTitle
您必须稍微更改实现(请参见我的编辑),因为您已经更改了问题。查看我的编辑如果提供了输入怎么办?my\u 123将成为My123不适用于my\u字符串:返回myString,预期为:MyString@Achilles等等,所以第一个字符应该总是大写?@阿喀琉斯我已经为我的_字符串修复了这个问题
  string source = "_my_string_123__A_";

  // MyString123A  
  string result = Regex
     // _ + lower case Letter -> upper case letter (thanks to Wiktor Stribiżew)
    .Replace(source, @"(_+|^)(\p{Ll})?", match => match.Groups[2].Value.ToUpper())
     // all the other _ should be just removed
    .Replace("_", "");
public string GetNewString(string input)
{
    var convert = false;
    var sb = new StringBuilder();

    foreach (var c in input)
    {
        if (c == '_')
        {
            convert = true;
            continue;
        }

        if (convert)
        {
            sb.Append(char.ToUpper(c));
            convert = false;
            continue;
        }

        sb.Append(c);
    }

    return sb.ToString().First().ToString().ToUpper() + sb.ToString().Substring(1);
}
GetNewString("my_string");
GetNewString("___this_is_anewstring_");
GetNewString("___this_is_123new34tring_");
    static string toCamel(string input)
    {
        StringBuilder sb = new StringBuilder();
        int i;
        for (i = 0; i < input.Length; i++)
        {
            if ((i == 0) || (i > 0 && input[i - 1] == '_'))
                sb.Append(char.ToUpper(input[i]));
            else
                sb.Append(char.ToLower(input[i]));
        }
        return sb.ToString();
    }