2010-12-20 24 views

Respuesta

65

Use thi s de expresiones regulares (que se olvidó de la que stackoverflow respuesta que lo adquirieron, buscará ahora):

public static string ToLowercaseNamingConvention(this string s, bool toLowercase) 
     { 
      if (toLowercase) 
      { 
       var r = new Regex(@" 
       (?<=[A-Z])(?=[A-Z][a-z]) | 
       (?<=[^A-Z])(?=[A-Z]) | 
       (?<=[A-Za-z])(?=[^A-Za-z])", RegexOptions.IgnorePatternWhitespace); 

       return r.Replace(s, "_").ToLower(); 
      } 
      else 
       return s; 
     } 

lo uso en este proyecto: http://www.ienablemuch.com/2010/12/intelligent-brownfield-mapping-system.html

[EDIT]

lo encontré ahora: How do I convert CamelCase into human-readable names in Java?

Muy bien dividida "TodayILiveInTheUSAWithSimon", no hay espacio en la parte delantera de "Hoy":

using System; 
using System.Text.RegularExpressions; 

namespace TestSplit 
{ 
    class MainClass 
    { 
     public static void Main (string[] args) 
     { 
      Console.WriteLine ("Hello World!"); 



      var r = new Regex(@" 
       (?<=[A-Z])(?=[A-Z][a-z]) | 
       (?<=[^A-Z])(?=[A-Z]) | 
       (?<=[A-Za-z])(?=[^A-Za-z])", RegexOptions.IgnorePatternWhitespace); 


      string s = "TodayILiveInTheUSAWithSimon"; 
      Console.WriteLine("YYY{0}ZZZ", r.Replace(s, " ")); 
     } 
    } 
} 

Salida:

YYYToday I Live In The USA With SimonZZZ 
+0

¡Muchas gracias! ¿Puedes explicar las diferentes partes de la expresión regular? – Nir

18

Puede simplemente bucle a través de los personajes, y añadir espacios donde sea necesario:

string theString = "SeveralWordsString"; 

StringBuilder builder = new StringBuilder(); 
foreach (char c in theString) { 
    if (Char.IsUpper(c) && builder.Length > 0) builder.Append(' '); 
    builder.Append(c); 
} 
theString = builder.ToString(); 
45
string[] SplitCamelCase(string source) { 
    return Regex.Split(source, @"(?<!^)(?=[A-Z])"); 
} 

muestra:

https://dotnetfiddle.net/0DEt5m

+0

Simple y fácil de implementar. ¡Gran respuesta! – MiBol

+3

buena respuesta. use 'return string.Join (" ", Regex.Split (value, @" (?

+0

Un hilo viejo pero encontré esto útil. Este es un método de extensión que adapté de esta respuesta: 'cadena estática pública SplitCamelCase (esta entrada de cadena, string delimeter =" ") { return input.Any (char.IsUpper)? string.Join (delimeter, Regex.Split (input, "(? Anders

2
  string str1 = "SeveralWordsString"; 
      string newstring = ""; 
      for (int i = 0; i < str1.Length; i++) 
      { 
       if (char.IsUpper(str1[i])) 
        newstring += " ";      
       newstring += str1[i].ToString(); 
      } 
+0

Realmente debería usar un 'StringBuilder' en lugar de crear una gran cantidad de cadenas. – Andrew

5
public static IEnumerable<string> SplitOnCapitals(string text) 
    { 
     Regex regex = new Regex(@"\p{Lu}\p{Ll}*"); 
     foreach (Match match in regex.Matches(text)) 
     { 
      yield return match.Value;  
     } 
    } 

Este se encargará de Unicode correctamente.

Cuestiones relacionadas