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

什么是从帕斯卡案件(上层骆驼案件)转换为一个句子的最佳途径。

例如开始

"AwaitingFeedback" 

并将其转换为

 "Awaiting feedback" 

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

 public static string ToSentenceCase(this string str) { return Regex.Replace(str, "[az][AZ]", m => m.Value[0] + " " + char.ToLower(m.Value[1])); } 

在2015年之后的Visual Studio版本中,您可以这样做

 public static string ToSentenceCase(this string str) { return Regex.Replace(str, "[az][AZ]", m => $"{m.Value[0]} {char.ToLower(m.Value[1])}"); } 

基于: 使用正则expression式将Pascal大小写转换为句子

干得好…

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

这适用于我:

 Regex.Replace(strIn, "([AZ]{1,2}|[0-9]+)", " $1").TrimStart() 

发现这在MvcContrib的来源,似乎没有在这里提到。

 return Regex.Replace(input, "([AZ])", " $1", RegexOptions.Compiled).Trim(); 

我宁愿为此使用Humanizer。 Humanizer是一个可移植的类库,可以满足你所有的.NET操作和显示string,枚举,date,时间,时间段,数量和数量的需要。

简答

 "AwaitingFeedback".Humanize() => Awaiting feedback 

长和描述性的答案

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" 

完整的代码是:

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

产量

等待反馈

Pascal大小写inputstring变成句子

下划线的inputstring变成可以返回标题大小写的句子

可以返回小写

如果你更喜欢编写你自己的C#代码,你可以通过编写一些C#代码来达到这个目的。

这里有一个基本的方法,我想出了使用正则expression式

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

它也将拆分我没有指定但会有用的数字。

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

 Regex.Replace("ThisIsMyCapsDelimitedString", "(\\B[AZ])", " $1") 

我会使用一个正则expression式,在每个大写字符前插入一个空格,然后降低所有的string。

  string spacedString = System.Text.RegularExpressions.Regex.Replace(yourString, "\B([AZ])", " \k"); spacedString = spacedString.ToLower(); 
 string camel = "MyCamelCaseString"; string s = Regex.Replace(camel, "([AZ])", " $1").ToLower().Trim(); Console.WriteLine(s.Substring(0,1).ToUpper() + s.Substring(1)); 

编辑:没有注意到你的套pipe要求,相应地修改。 你可以使用matchevaluator做套pipe,但我认为一个子string更容易。 你也可以把它换成第二个正则expression式,replace你改变第一个字符的地方

 "^\w" 

向上

 \U (i think) 

在JavaScript(或PHP等)中,您可以在replace调用中定义函数:

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

虽然我还没有解决初始上限问题… 🙂

现在,对于Java解决scheme:

 String ToSentence(String camel) { if (camel == null) return ""; // Or null... String[] words = camel.split("(?=[AZ])"); 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")); 

注意分裂句子而不丢失任何字符的技巧…

伪代码:

 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 

更好的方法可以通过使用正则expression式或stringreplace例程来完成(将'X'replace为'x')

适用于UpperCamel和lowerCamel情况的xquery解决scheme:

输出句子(只有第一个单词的第一个字母大写):

 declare function content:sentenceCase($string) { let $firstCharacter := substring($string, 1, 1) let $remainingCharacters := substring-after($string, $firstCharacter) return concat(upper-case($firstCharacter),lower-case(replace($remainingCharacters, '([AZ])', ' $1'))) }; 

输出标题大小写(大写的每个单词的第一个字符):

 declare function content:titleCase($string) { let $firstCharacter := substring($string, 1, 1) let $remainingCharacters := substring-after($string, $firstCharacter) return concat(upper-case($firstCharacter),replace($remainingCharacters, '([AZ])', ' $1')) }; 

大部分已经在这里回答

接受答案的小chage,把第二个和后来的大写字母转换为小写,所以改变

 if (char.IsUpper(text[i])) newText.Append(' '); newText.Append(text[i]); 

 if (char.IsUpper(text[i])) { newText.Append(' '); newText.Append(char.ToLower(text[i])); } else newText.Append(text[i]); 

发现自己在做类似的事情,我很欣赏这个讨论的出发点。 这是我的解决scheme,作为控制台应用程序上下文中string类的扩展方法放置。

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