2008-11-27 42 views
58

Cách tốt nhất để chuyển đổi từ Pascal Case (upper Camel Case) thành một câu.Cách tốt nhất để chuyển đổi Pascal Case thành câu

Ví dụ bắt đầu với

"AwaitingFeedback" 

và chuyển đổi đó để

"Awaiting feedback" 

C# thích hợp hơn nhưng tôi có thể chuyển đổi nó từ Java hoặc tương đương.

+1

Trường hợp Camel đang chờPhản hồi và không Đang chờPhản hồi (Trường hợp Pascal). Ngoài ra, những gì bạn muốn làm là không hoàn toàn có thể. Làm thế nào về disableGPS? Có một giải pháp chung đủ để xử lý các trường hợp này? – kgiannakakis

+0

@kgiannakakis đã thay đổi câu hỏi cho phù hợp. Tôi luôn luôn quên đi cách nào tròn tên, đặc biệt là với trường hợp Camel Case trên và dưới. –

Trả lời

1

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 cách có lẽ có thể được thực hiện bằng cách sử dụng regex hay bởi thói quen chuỗi thay thế (thay thế 'X' với 'x')

2

Tôi muốn sử dụng một regex, chèn một dấu cách trước mỗi ký tự chữ hoa, sau đó giảm tất cả chuỗi.

string spacedString = System.Text.RegularExpressions.Regex.Replace(yourString, "\B([A-Z])", " \k"); 
    spacedString = spacedString.ToLower(); 
+0

Tôi không biết C# nhưng tôi không nghĩ rằng thoát như \ s là hợp pháp trong phần thay thế: làm thế nào ngôn ngữ sẽ biết nếu nó phải chèn không gian, tab hoặc cái gì khác? :-) – PhiLho

+0

Bạn nói đúng, nên đơn giản hơn để thay thế bằng một "" rõ ràng. – Antoine

+0

Điều duy nhất tôi muốn nói là sẽ tạo ra "đang chờ phản hồi" –

15

Ở đây bạn đi ...

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

Bạn nên ToUpper() ký tự đầu tiên, nếu không thói quen của bạn không hoạt động với true camelCase, chỉ PascalCase –

+0

Yup đẹp bắt được, tôi biết điều gì đó không ổn (nhưng không thể đặt ngón tay lên đó) khi anh ấy nói "Đang chờ phản hồi" là trường hợp lạc đà! –

2

Nó rất dễ dàng để làm trong JavaScript (hoặc PHP, vv), nơi bạn có thể định nghĩa một hàm trong các cuộc gọi thay thế:

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

Mặc dù tôi chưa giải quyết được vấn đề giới hạn ban đầu ... :-)

Bây giờ, đối với giải pháp Java:

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

Lưu ý lừa để phân chia các câu mà không mất bất kỳ ký tự ...

4

Đây là một cách cơ bản để làm việc đó mà tôi đã đưa ra với việc sử dụng 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(); 
} 

Nó cũng sẽ tách ra những con số mà tôi không chỉ định nhưng sẽ hữu ích.

2
string camel = "MyCamelCaseString"; 
string s = Regex.Replace(camel, "([A-Z])", " $1").ToLower().Trim(); 
Console.WriteLine(s.Substring(0,1).ToUpper() + s.Substring(1)); 

Chỉnh sửa: không nhận thấy yêu cầu về vỏ của bạn, được điều chỉnh cho phù hợp. Bạn có thể sử dụng một matchevaluator để làm vỏ, nhưng tôi nghĩ rằng một chuỗi con là dễ dàng hơn.Bạn cũng có thể bọc nó trong một regex thứ 2 thay thế nơi bạn thay đổi ký tự đầu tiên

"^\w" 

để trên

\U (i think) 
0

Chủ yếu là already answered here

chage nhỏ để câu trả lời được chấp nhận, để chuyển đổi thứ hai và chữ cái viết hoa tiếp theo viết hoa chữ thường, do đó, hãy thay đổi

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

đến

if (char.IsUpper(text[i]))     
{ 
    newText.Append(' ');    
    newText.Append(char.ToLower(text[i])); 
} 
else 
    newText.Append(text[i]); 
59
public static string ToSentenceCase(this string str) 
{ 
    return Regex.Replace(str, "[a-z][A-Z]", m => m.Value[0] + " " + char.ToLower(m.Value[1])); 
} 

Trong các phiên bản của visual studio sau năm 2015, bạn có thể làm

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

Dựa trên: Converting Pascal case to sentences using regular expression

1

Một giải pháp xquery mà làm việc cho cả hai trường hợp UpperCamel và lowerCamel:

Trường hợp câu đầu ra (chỉ ký tự đầu tiên của từ đầu tiên là c apitalized):

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, '([A-Z])', ' $1'))) 
}; 

Để title case đầu ra (ký tự đầu tiên của mỗi từ được vốn hoá):

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

này làm việc cho tôi:

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

Làm cách nào để thay đổi trường hợp của chữ cái sau dấu cách? –

+0

Điều này có thể không trả lại những gì bạn dự định cho các trường hợp như 'Đang chờ phản hồi' hoặc 'Đang chờ trả lời9'. [Câu trả lời của Jef] (https://stackoverflow.com/a/11432809/661933) là tốt hơn cho tôi (trả về 'Đang chờ phản hồi T và' Phản hồi của Awaiting9 lần lượt). – nawfal

4

Đây chỉ là như @ SSTA, nhưng hiệu quả hơn gọi là TrimStart.

Regex.Replace("ThisIsMyCapsDelimitedString", "(\\B[A-Z])", " $1") 
6

Tìm thấy điều này trong nguồn MvcContrib, dường như chưa được đề cập ở đây.

return Regex.Replace(input, "([A-Z])", " $1", RegexOptions.Compiled).Trim(); 
0

Tìm thấy chính mình đang làm điều gì đó tương tự và tôi đánh giá cao việc có điểm khởi hành với cuộc thảo luận này. Đây là giải pháp của tôi, được đặt như một phương thức mở rộng cho lớp chuỗi trong ngữ cảnh của một ứng dụng giao diện điều khiển.

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

Tôi muốn sử dụng Humanizer cho việc này. Humanizer là một thư viện lớp di động đáp ứng tất cả các nhu cầu .NET của bạn để thao tác và hiển thị chuỗi, enums, ngày tháng, thời gian, timespans, số lượng và số lượng.

ngắn trả lời

"AwaitingFeedback".Humanize() => Awaiting feedback 

Long và mô tả trả lời

Humanizer có thể làm việc nhiều hơn ví dụ khác là:

"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" 

mã hoàn chỉnh là:

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

Output

Đang chờ phản hồi

Pascal chuỗi trường hợp đầu vào được chuyển thành câu

nhấn chuỗi đầu vào được chuyển thành câu có thể Return Tiêu đề Trường hợp

có thể trở lại thấp hơn trường hợp

Nếu bạn thích viết mã C# của riêng bạn, bạn có thể đạt được điều này bằng cách viết một số công cụ mã C# như đã được người khác trả lời.

Các vấn đề liên quan