2011-12-13 32 views
7

Tôi có một danh sách các từ cần được làm cho con người có thể đọc được, chẳng hạn như FirstName to First Name, LastName to Last Name, và trong một số trường hợp, các từ viết tắt như ARB vẫn giữ nguyên. Sau đó gần đây đã được giới thiệu và đã gây ra một vấn đề hiển thị vì biểu thức chính quy của chúng tôi trả về AR Bs. Đây là những gì chúng ta có, mà tôi biết là không đủ để viết tắt:Tách chuỗi PascalCase trừ từ viết tắt

([A-Z][a-z]+) 

tôi đã tìm thấy những biểu hiện khác trên SO và trên các trang web khác có thể làm việc với từ viết tắt, tuy nhiên họ làm việc trên dây mà viết tắt là trong vòng chuỗi chứ không phải là toàn bộ chuỗi. Tôi có thể thực hiện các biểu thức thông thường đơn giản, nhưng điều này quá phức tạp đối với các kỹ năng của tôi. Tôi sẽ cung cấp các ví dụ khác để thử nghiệm nếu tôi có chúng, nhưng tất cả các chuỗi hoạt động tốt ngoại trừ một chuỗi mới, ARB. Cảm ơn bạn.

Cập nhật: Dưới đây là các mã sử dụng

string friendlyName = Regex.Replace(field.Name, "([A-Z][a-z]+)", " $1", RegexOptions.Compiled).Trim(); 
+0

Thật không may vấn đề này có thể kết thúc với sự mơ hồ chưa được giải quyết, ví dụ: 'ConfigureIDEAsUser' được chia thành" Định cấu hình IDE là người dùng "hoặc" Định cấu hình IDEA người dùng "? –

Trả lời

12

Sẽ không [A-Z]+[a-z]* làm điều đó? Điều đó phải khớp với một hoặc nhiều chữ cái viết hoa theo sau là chữ cái viết hoa hoặc chữ thường. Vì vậy, ARBs sẽ vẫn là một thực thể duy nhất, nhưng CamelCase sẽ được chia thành Camel Case.

+0

Tôi không thể tin rằng nó đơn giản ... cảm ơn bạn !! – Mathachew

+0

Giải pháp tuyệt vời. Có cách nào để có được "HereIsGPSData" được "Đây là dữ liệu GPS"? Tôi có thể thấy nó sẽ khó ở đâu. Nhưng tôi sẽ giả định rằng nếu có một ký tự chữ thường sau một tập hợp các ký tự chữ hoa mà phần trên cùng không phải là một phần của từ viết tắt. – Grandizer

+1

Thực tế đã tìm ra. Sử dụng (? Grandizer

0

Làm thế nào về điều này?

[A-Z][a-z]+|[A-Z] 
0

Một chuỗi/đoạn/câu bao gồm Từ viết tắt có thể được chuyển thành chuỗi/chuỗi có thể đọc được con người. Tôi chỉ đang cố gắng định dạng chuỗi Pascal Cased, tôi đã nghiên cứu nhiều hơn và cố gắng thậm chí chuyển đổi Từ viết tắt thành Định dạng dễ hiểu.

dữ liệu thử nghiệm:

Input: "QWERTYSomeThing OmitTRYSomeThing MayBeWorkingFYI"

Output: "QWERTY Một số Thing Bỏ qua TRY Một số Thing có thể làm việc FYI"

Mã số: Truyền chuỗi đầu vào vào phương thức được đưa ra bên dưới.

private static string FormatPascalAndAcronym(string input) 
    { 
     var builder = new StringBuilder(input[0].ToString()); 
     if (builder.Length > 0) 
     { 
      for (var index = 1; index < input.Length; index++) 
      { 
       char prevChar = input[index - 1]; 
       char nextChar = index + 1 < input.Length ? input[index + 1] : '\0'; 

       bool isNextLower = Char.IsLower(nextChar); 
       bool isNextUpper = Char.IsUpper(nextChar); 
       bool isPresentUpper = Char.IsUpper(input[index]); 
       bool isPrevLower = Char.IsLower(prevChar); 
       bool isPrevUpper = Char.IsUpper(prevChar); 

       if(!string.IsNullOrWhiteSpace(prevChar.ToString()) && 
        ((isPrevUpper&& isPresentUpper && isNextLower) || 
        (isPrevLower&&isPresentUpper&&isNextLower)|| 
        (isPrevLower&&isPresentUpper&&isNextUpper))) 
       { 
        builder.Append(' '); 
        builder.Append(input[index]); 
       } 
       else{ 
       builder.Append(input[index]); 
       } 
      } 
     } 
     return builder.ToString(); 
    } 
+0

Điều này không đúng đối với trường hợp thử nghiệm duy nhất được đề cập trong câu hỏi. Mặc dù đó có thể là quy tắc phù hợp với mọi người khác. –

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