C# 如何将文本转换为Pascal大小写?

C# 如何将文本转换为Pascal大小写?,c#,pascalcasing,case-conversion,C#,Pascalcasing,Case Conversion,我有一个变量名,比如“WARD_VS_VITAL_SIGNS”,我想把它转换成Pascal case格式:“WardVsVitalSigns” 如何进行转换?首先,您要求的是标题大小写,而不是驼峰大小写,因为驼峰大小写中单词的第一个字母是小写的,您的示例显示您希望第一个字母是大写的 无论如何,以下是您实现预期结果的方法: string textToChange = "WARD_VS_VITAL_SIGNS"; System.Text.StringBuilder resultBuilder = n

我有一个变量名,比如“WARD_VS_VITAL_SIGNS”,我想把它转换成Pascal case格式:“WardVsVitalSigns”


如何进行转换?

首先,您要求的是标题大小写,而不是驼峰大小写,因为驼峰大小写中单词的第一个字母是小写的,您的示例显示您希望第一个字母是大写的

无论如何,以下是您实现预期结果的方法:

string textToChange = "WARD_VS_VITAL_SIGNS";
System.Text.StringBuilder resultBuilder = new System.Text.StringBuilder();

foreach(char c in textToChange)
{
    // Replace anything, but letters and digits, with space
    if(!Char.IsLetterOrDigit(c))
    {
        resultBuilder.Append(" ");
    }
    else 
    { 
        resultBuilder.Append(c); 
    }
}

string result = resultBuilder.ToString();

// Make result string all lowercase, because ToTitleCase does not change all uppercase correctly
result = result.ToLower();

// Creates a TextInfo based on the "en-US" culture.
TextInfo myTI = new CultureInfo("en-US",false).TextInfo;

result = myTI.ToTitleCase(result).Replace(" ", String.Empty);
注意:
result
现在是
WardVsVitalSigns

如果您确实需要camel case,那么在完成上述所有操作之后,只需使用此帮助器函数:

public string LowercaseFirst(string s)
{
    if (string.IsNullOrEmpty(s))
    {
        return string.Empty;
    }

    char[] a = s.ToCharArray();
    a[0] = char.ToLower(a[0]);

    return new string(a);
}
所以你可以这样称呼它:

result = LowercaseFirst(result);

这不需要正则表达式

var yourString = "WARD_VS_VITAL_SIGNS".ToLower().Replace("_", " ");
TextInfo info = CultureInfo.CurrentCulture.TextInfo;
yourString = info.ToTitleCase(yourString).Replace(" ", string.Empty);
Console.WriteLine(yourString);

您可以根据需要修改代码

使用
System
System.Linq
System.String
与.NET核心兼容代码的扩展方法

var xs = "WARD_VS_VITAL_SIGNS".Split('_');

var q =

    from x in xs

    let first_char = char.ToUpper(x[0]) 
    let rest_chars = new string(x.Skip(1).Select(c => char.ToLower(c)).ToArray())

    select first_char + rest_chars;
不修改原始字符串

使用系统;
使用System.Linq;
公共静态类扩展
{
/// 
///将字符串转换为PascalCase
/// 
///要转换的字符串
公共静态字符串ToPascalCase(此字符串str){
//将所有非字母和非数字替换为下划线,其余替换为小写。
string sample=string.Join(“,str?.Select(c=>Char.isleterordigit(c)?c.ToString().ToLower():“”).ToArray());
//按下划线拆分结果字符串
//选择第一个字符,大写并与字符串的其余部分连接
var arr=样本?
.Split(新[]{'''},StringSplitOptions.RemoveEmptyEntries)
.Select(s=>$”{s.Substring(0,1).ToUpper()}{s.Substring(1)}”);
//加入结果集合
sample=string.Join(“,arr);
返回样品;
}
}
公共课程
{
公共静态void Main()
{
Console.WriteLine(“病房VS_生命体征”.ToPascalCase());//病房VS_生命体征
Console.WriteLine(“我是谁?”.ToPascalCase());//WhoAmI
Console.WriteLine(“我在你来这里之前吃过东西。”.ToPascalCase());//在你来这里之前
Console.WriteLine(“你好,我是谁?”.ToPascalCase());//你好
Console.WriteLine(“长寿并繁荣”.ToPascalCase());//长寿并繁荣
Console.WriteLine(“Lorem ipsum dolor sit amet,concertetur adipising elit.”.ToPascalCase());//Loremipsumdolorsitametconcertetura adipisingelit
}
}

单分号解决方案:

public static string PascalCase(this string word)
{
    return string.Join("" , word.Split('_')
                 .Select(w => w.Trim())
                 .Where(w => w.Length > 0)
                 .Select(w => w.Substring(0,1).ToUpper() + w.Substring(1).ToLower()));
}
以下是我的快速LINQ®ex解决方案,可以节省某人的时间:

using System;
using System.Linq;
using System.Text.RegularExpressions;

public string ToPascalCase(string original)
{
    Regex invalidCharsRgx = new Regex("[^_a-zA-Z0-9]");
    Regex whiteSpace = new Regex(@"(?<=\s)");
    Regex startsWithLowerCaseChar = new Regex("^[a-z]");
    Regex firstCharFollowedByUpperCasesOnly = new Regex("(?<=[A-Z])[A-Z0-9]+$");
    Regex lowerCaseNextToNumber = new Regex("(?<=[0-9])[a-z]");
    Regex upperCaseInside = new Regex("(?<=[A-Z])[A-Z]+?((?=[A-Z][a-z])|(?=[0-9]))");

    // replace white spaces with undescore, then replace all invalid chars with empty string
    var pascalCase = invalidCharsRgx.Replace(whiteSpace.Replace(original, "_"), string.Empty)
        // split by underscores
        .Split(new char[] { '_' }, StringSplitOptions.RemoveEmptyEntries)
        // set first letter to uppercase
        .Select(w => startsWithLowerCaseChar.Replace(w, m => m.Value.ToUpper()))
        // replace second and all following upper case letters to lower if there is no next lower (ABC -> Abc)
        .Select(w => firstCharFollowedByUpperCasesOnly.Replace(w, m => m.Value.ToLower()))
        // set upper case the first lower case following a number (Ab9cd -> Ab9Cd)
        .Select(w => lowerCaseNextToNumber.Replace(w, m => m.Value.ToUpper()))
        // lower second and next upper case letters except the last if it follows by any lower (ABcDEf -> AbcDef)
        .Select(w => upperCaseInside.Replace(w, m => m.Value.ToLower()));

    return string.Concat(pascalCase);
}

有些答案是正确的,但我真的不明白为什么他们会先将文本设置为小写,因为
ToTitleCase
会自动处理:

var text = "WARD_VS_VITAL_SIGNS".Replace("_", " ");

TextInfo textInfo = CultureInfo.CurrentCulture.TextInfo;
text = textInfo.ToTitleCase(text).Replace(" ", string.Empty);

Console.WriteLine(text);
在添加了
ToLower()
之后,我发现它很有用

"WARD_VS_VITAL_SIGNS".ToLower().Split(new [] {"_"}, StringSplitOptions.RemoveEmptyEntries).Select(s => char.ToUpperInvariant(s[0]) + s.Substring(1, s.Length - 1)).Aggregate(string.Empty, (s1, s2) => s1 + s2)
您可以使用以下选项:

public static string ConvertToPascal(string underScoreString)
    {
        string[] words = underScoreString.Split('_');

        StringBuilder returnStr = new StringBuilder();

        foreach (string wrd in words)
        {
            returnStr.Append(wrd.Substring(0, 1).ToUpper());
            returnStr.Append(wrd.Substring(1).ToLower());

        }
        return returnStr.ToString();
    }

您真的需要使用正则表达式吗?或者没有正则表达式的方法可以吗?如果您有问题,并且您想使用正则表达式来解决这个问题,那么您现在有两个问题。;-)@AshishGupta;-)你说得对,我确实让问题变得更复杂,无法用正则表达式来解决。为什么这不能使result=Wardvsvitalsigns?@KarlAnderson,谢谢你详细的回答,这很有帮助。;-)@KarlAnderson
if(!Char.isleterOrdigit(c)){resultBuilder.Append(“”;}
应该是
if(!Char.isleterOrdigit(c)){resultBuilder.Append(“”;}否则{resultBuilder.Append(c);}
,否则,resultBuilder始终为空。;-)我认为从技术上讲这是帕斯卡案例(或上骆驼案例)@Benjol谢谢你提醒,我会更新这个问题。这个答案没有足够的投票。好实用。谢谢是的,这个或其他一些高效的版本(不确定是否可以在没有正则表达式的情况下实现它)应该是的一部分。NetBecase ToTitleCase在许多用例中都不高效,请参见当前页面。ToTitleCase不会使其他字符小写,至少在.NET Core 3.1中我不需要它。所以我们必须先做一个测试,然后它是正确的。不确定这是什么意思,但这肯定不会导致PascalCase。PascalCase不包含空格。。。
var text = "WARD_VS_VITAL_SIGNS".Replace("_", " ");

TextInfo textInfo = CultureInfo.CurrentCulture.TextInfo;
text = textInfo.ToTitleCase(text).Replace(" ", string.Empty);

Console.WriteLine(text);
"WARD_VS_VITAL_SIGNS".ToLower().Split(new [] {"_"}, StringSplitOptions.RemoveEmptyEntries).Select(s => char.ToUpperInvariant(s[0]) + s.Substring(1, s.Length - 1)).Aggregate(string.Empty, (s1, s2) => s1 + s2)
public static string ConvertToPascal(string underScoreString)
    {
        string[] words = underScoreString.Split('_');

        StringBuilder returnStr = new StringBuilder();

        foreach (string wrd in words)
        {
            returnStr.Append(wrd.Substring(0, 1).ToUpper());
            returnStr.Append(wrd.Substring(1).ToLower());

        }
        return returnStr.ToString();
    }