2010-12-20 14 views
33

Mögliche Duplizieren:
Regular expression, split string by capital letter but ignore TLAZerlegt einen String mit Großbuchstaben

Ich habe eine Zeichenfolge, die eine Kombination aus mehreren Wörtern ist, wird jedes Wort groß geschrieben.
Zum Beispiel: MehrereWorteString

Mit C#, wie spalte ich die Zeichenfolge in "Mehrere Wörter String" auf intelligente Weise?

Danke!

+0

Splitting schlägt vor, dass Sie ein Array von Zeichenfolgen möchten, aber es sieht so aus, als ob Sie lieber Leerzeichen in die Zeichenfolge einfügen möchten? – Guffa

Antwort

65

Verwenden Sie thi s regex (ich habe vergessen, aus der Antwort Stackoverflow ich es stammt, wird es suchen jetzt):

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

ich es in diesem Projekt verwenden: http://www.ienablemuch.com/2010/12/intelligent-brownfield-mapping-system.html

[EDIT]

ich es gefunden jetzt: How do I convert CamelCase into human-readable names in Java?

Schön split "TodayILiveInTheUSAWithSimon", kein Platz auf der Vorderseite der "Heute":

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

Ausgang:

YYYToday I Live In The USA With SimonZZZ 
+0

Vielen Dank! Kannst du die verschiedenen Teile der Regex erklären? – Nir

18

Sie können nur eine Schleife durch die Zeichen und Leerzeichen hinzufügen, wo nötig:

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

Probe:

https://dotnetfiddle.net/0DEt5m

+0

Einfach und einfach zu implementieren. Gute Antwort! – MiBol

+3

gute Antwort. Verwenden Sie 'return string.Join (" ", Regex.Split (Wert, @" (?

+0

Ein alter Thread, aber ich fand das nützlich. Dies ist eine Erweiterungsmethode, die ich aus dieser Antwort übernommen habe: 'public static string SplitCamelCase (diese Zeichenketteneingabe, string delimeter =" ") { return input.Any (char.IsUpper)? string.Join (Begrenzer, Regex.Split (Eingabe, "(? 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

Sie sollten wirklich einen 'StringBuilder' verwenden, anstatt eine große Anzahl von Strings zu erzeugen. – 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;  
     } 
    } 

Dies wird Unicode ordnungsgemäß behandeln.

Verwandte Themen