Best way to convert Pascal Case to a sentence

后端 未结 16 1923
天命终不由人
天命终不由人 2020-12-08 13:00

What is the best way to convert from Pascal Case (upper Camel Case) to a sentence.

For example starting with

\"AwaitingFeedback\"

a

相关标签:
16条回答
  • 2020-12-08 13:19

    It is easy to do in JavaScript (or PHP, etc.) where you can define a function in the replace call:

    var camel = "AwaitingFeedbackDearMaster";
    var sentence = camel.replace(/([A-Z].)/g, function (c) { return ' ' + c.toLowerCase(); });
    alert(sentence);
    

    Although I haven't solved the initial cap problem... :-)

    Now, for the Java solution:

    String ToSentence(String camel)
    {
      if (camel == null) return ""; // Or null...
      String[] words = camel.split("(?=[A-Z])");
      if (words == null) return "";
      if (words.length == 1) return words[0];
      StringBuilder sentence = new StringBuilder(camel.length());
      if (words[0].length() > 0) // Just in case of camelCase instead of CamelCase
      {
        sentence.append(words[0] + " " + words[1].toLowerCase());
      }
      else
      {
        sentence.append(words[1]);
      }
      for (int i = 2; i < words.length; i++)
      {
        sentence.append(" " + words[i].toLowerCase());
      }
      return sentence.toString();
    }
    
    System.out.println(ToSentence("AwaitingAFeedbackDearMaster"));
    System.out.println(ToSentence(null));
    System.out.println(ToSentence(""));
    System.out.println(ToSentence("A"));
    System.out.println(ToSentence("Aaagh!"));
    System.out.println(ToSentence("stackoverflow"));
    System.out.println(ToSentence("disableGPS"));
    System.out.println(ToSentence("Ahh89Boo"));
    System.out.println(ToSentence("ABC"));
    

    Note the trick to split the sentence without loosing any character...

    0 讨论(0)
  • 2020-12-08 13:20

    Here's a basic way of doing it that I came up with using Regex

    public static string CamelCaseToSentence(this string value)
    {
        var sb = new StringBuilder();
        var firstWord = true;
    
        foreach (var match in Regex.Matches(value, "([A-Z][a-z]+)|[0-9]+"))
        {
            if (firstWord)
            {
                sb.Append(match.ToString());
                firstWord = false;
            }
            else
            {
                sb.Append(" ");
                sb.Append(match.ToString().ToLower());
            }
        }
    
        return sb.ToString();
    }
    

    It will also split off numbers which I didn't specify but would be useful.

    0 讨论(0)
  • 2020-12-08 13:21

    Found this in the MvcContrib source, doesn't seem to be mentioned here yet.

    return Regex.Replace(input, "([A-Z])", " $1", RegexOptions.Compiled).Trim();
    
    0 讨论(0)
  • 2020-12-08 13:21

    Pseudo-code:

    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
    

    Better ways can perhaps be done by using regex or by string replacement routines (replace 'X' with ' x')

    0 讨论(0)
  • 2020-12-08 13:24

    This is just like @SSTA, but is more efficient than calling TrimStart.

    Regex.Replace("ThisIsMyCapsDelimitedString", "(\\B[A-Z])", " $1")
    
    0 讨论(0)
  • 2020-12-08 13:25

    Found myself doing something similar, and I appreciate having a point-of-departure with this discussion. This is my solution, placed as an extension method to the string class in the context of a console application.

    using System;
    using System.Text;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                string piratese = "avastTharMatey";
                string ivyese = "CheerioPipPip";
    
                Console.WriteLine("{0}\n{1}\n", piratese.CamelCaseToString(), ivyese.CamelCaseToString());
                Console.WriteLine("For Pete\'s sake, man, hit ENTER!");
                string strExit = Console.ReadLine();
            }
    
        }
    
        public static class StringExtension
        {
            public static string CamelCaseToString(this string str)
            {
                StringBuilder retVal = new StringBuilder(32);
    
                if (!string.IsNullOrEmpty(str))
                {
                    string strTrimmed = str.Trim();
    
                    if (!string.IsNullOrEmpty(strTrimmed))
                    {
                        retVal.Append(char.ToUpper(strTrimmed[0]));
    
                        if (strTrimmed.Length > 1)
                        {
                            for (int i = 1; i < strTrimmed.Length; i++)
                            {
                                if (char.IsUpper(strTrimmed[i])) retVal.Append(" ");
    
                                retVal.Append(char.ToLower(strTrimmed[i]));
                            }
                        }
                    }
                }
                return retVal.ToString();
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题