2016-05-18 13 views

Trả lời

8

Dưới đây là làm thế nào để làm điều đó với một biểu thức chính quy:

public static class StringExtensions 
{ 
    public static string PascalToKebabCase(this string value) 
    { 
     if (string.IsNullOrEmpty(value)) 
      return value; 

     return Regex.Replace(
      value, 
      "(?<!^)([A-Z][a-z]|(?<=[a-z])[A-Z])", 
      "-$1", 
      RegexOptions.Compiled) 
      .Trim() 
      .ToLower(); 
    } 
} 
+2

@Nasreddine Tôi có một giải pháp, tôi muốn xem các giải pháp thay thế. Câu trả lời riêng được cho phép trong SO, miễn là câu hỏi chính nó là thích hợp. – Mikhail

+0

Chỉ cần kiểm tra và không chỉ cho phép mà còn được khuyến khích (https://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/). Có +1 để cung cấp giải pháp làm việc. – Nasreddine

+0

Bạn có lẽ nên đề cập rằng bạn đang tìm kiếm các giải pháp khác trong câu hỏi của bạn vì một số có thể tránh trả lời nếu họ thấy câu trả lời chính xác đã được đăng. – Nasreddine

3

Dưới đây là một cách để làm điều đó mà không sử dụng Regex:

public static string PascalToKebabCase(this string str) 
{ 
    if (string.IsNullOrEmpty(str)) 
     return string.Empty; 

    var builder = new StringBuilder(); 
    builder.Append(char.ToLower(str.First())); 

    foreach (var c in str.Skip(1)) 
    { 
     if (char.IsUpper(c)) 
     { 
      builder.Append('-'); 
      builder.Append(char.ToLower(c)); 
     } 
     else 
     { 
      builder.Append(c); 
     } 
    } 

    return builder.ToString(); 
} 

Bạn sẽ có vấn đề với tốt chữ viết tắt được biết đến sử dụng chữ hoa. Ví dụ: COMObject. Giải pháp này rõ ràng sẽ không hoạt động.

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