将Pascal Case转换为句子的最佳方式

Gar*_*ler 72 c# string

什么是从Pascal Case(上骆驼案)转换为句子的最佳方法.

例如,以.开头

"AwaitingFeedback"
Run Code Online (Sandbox Code Playgroud)

并将其转换为

"Awaiting feedback"
Run Code Online (Sandbox Code Playgroud)

C#更好,但我可以从Java或类似的转换它.

小智 69

public static string ToSentenceCase(this string str)
{
    return Regex.Replace(str, "[a-z][A-Z]", m => m.Value[0] + " " + char.ToLower(m.Value[1]));
}
Run Code Online (Sandbox Code Playgroud)

在2015年之后的视觉工作室版本中,你可以做到

public static string ToSentenceCase(this string str)
{
    return Regex.Replace(str, "[a-z][A-Z]", m => $"{m.Value[0]} {char.ToLower(m.Value[1])}");
}
Run Code Online (Sandbox Code Playgroud)

基于:使用正则表达式将Pascal案例转换为句子


Aut*_*act 15

干得好...

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CamelCaseToString
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(CamelCaseToString("ThisIsYourMasterCallingYou"));   
        }

        private static string CamelCaseToString(string str)
        {
            if (str == null || str.Length == 0)
                return null;

            StringBuilder retVal = new StringBuilder(32);

            retVal.Append(char.ToUpper(str[0]));
            for (int i = 1; i < str.Length; i++ )
            {
                if (char.IsLower(str[i]))
                {
                    retVal.Append(str[i]);
                }
                else
                {
                    retVal.Append(" ");
                    retVal.Append(char.ToLower(str[i]));
                }
            }

            return retVal.ToString();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 15

这对我有用:

Regex.Replace(strIn, "([A-Z]{1,2}|[0-9]+)", " $1").TrimStart()
Run Code Online (Sandbox Code Playgroud)

  • 这如何改变空格后的字母大小写? (5认同)

Ban*_*yan 13

我更喜欢使用Humanizer.Humanizer是一个可移植类库,可满足您操作和显示字符串,枚举,日期,时间,时间跨度,数字和数量的所有.NET需求.

简答

"AwaitingFeedback".Humanize() => Awaiting feedback
Run Code Online (Sandbox Code Playgroud)

冗长而具描述性的答案

Humanizer可以做更多的工作,其他例子是:

"PascalCaseInputStringIsTurnedIntoSentence".Humanize() => "Pascal case input string is turned into sentence"
"Underscored_input_string_is_turned_into_sentence".Humanize() => "Underscored input string is turned into sentence"
"Can_return_title_Case".Humanize(LetterCasing.Title) => "Can Return Title Case"
"CanReturnLowerCase".Humanize(LetterCasing.LowerCase) => "can return lower case"
Run Code Online (Sandbox Code Playgroud)

完整的代码是:

using Humanizer;
using static System.Console;

namespace HumanizerConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            WriteLine("AwaitingFeedback".Humanize());
            WriteLine("PascalCaseInputStringIsTurnedIntoSentence".Humanize());
            WriteLine("Underscored_input_string_is_turned_into_sentence".Humanize());
            WriteLine("Can_return_title_Case".Humanize(LetterCasing.Title));
            WriteLine("CanReturnLowerCase".Humanize(LetterCasing.LowerCase));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

产量

等待反馈

Pascal案例输入字符串变成句子

将下划线输入字符串转换为句子可以返回标题大小写

可以返回小写

如果您更喜欢编写自己的C#代码,可以通过编写一些其他人已经回答过的C#代码来实现这一点.


Bry*_*end 8

这就像@SSTA,但比调用TrimStart更有效.

Regex.Replace("ThisIsMyCapsDelimitedString", "(\\B[A-Z])", " $1")
Run Code Online (Sandbox Code Playgroud)


Jef*_*aes 8

在MvcContrib源代码中找到了这个,这里似乎没有提到.

return Regex.Replace(input, "([A-Z])", " $1", RegexOptions.Compiled).Trim();
Run Code Online (Sandbox Code Playgroud)


drz*_*aus 5

仅仅因为每个人都在使用正则表达式(除了这个家伙),这里的实现在我的测试中速度StringBuilder大约是5 倍。还包括检查数字。

"SomeBunchOfCamelCase2".FromCamelCaseToSentence == "Some Bunch Of Camel Case 2"

public static string FromCamelCaseToSentence(this string input) {
    if(string.IsNullOrEmpty(input)) return input;

    var sb = new StringBuilder();
    // start with the first character -- consistent camelcase and pascal case
    sb.Append(char.ToUpper(input[0]));

    // march through the rest of it
    for(var i = 1; i < input.Length; i++) {
        // any time we hit an uppercase OR number, it's a new word
        if(char.IsUpper(input[i]) || char.IsDigit(input[i])) sb.Append(' ');
        // add regularly
        sb.Append(input[i]);
    }

    return sb.ToString();
}
Run Code Online (Sandbox Code Playgroud)


sch*_*der 1

伪代码:

NewString = "";
Loop through every char of the string (skip the first one)
   If char is upper-case ('A'-'Z')
     NewString = NewString + ' ' + lowercase(char)
   Else
     NewString = NewString + char
Run Code Online (Sandbox Code Playgroud)

更好的方法也许可以通过使用正则表达式或字符串替换例程来完成(将“X”替换为“x”)