2009-03-03 3 views
0

Ich schreibe etwas Code, der String-Normalisierung tun muss, möchte ich eine gegebene Zeichenfolge in eine Camel-Case-Darstellung (na ja, um die beste Schätzung zumindest). Beispiel:String Normalisierung

"the quick brown fox" => "TheQuickBrownFox" 
"the_quick_brown_fox" => "TheQuickBrownFox" 
"123The_quIck bROWN FOX" => "TheQuickBrownFox" 
"the_quick brown fox 123" => "TheQuickBrownFox123" 
"thequickbrownfox" => "Thequickbrownfox" 

Ich denke, Sie sollten die Idee, aus diesen Beispielen erhalten können. Ich möchte alle spezielle Zeichen Streifen aus (‘,“,, @, usw.!)., Kapital jedes Wort (Wörter durch ein Leerzeichen definiert sind, _ oder -) und alle führende Zahlen gesunken (Hinter/intern sind ok, aber diese Anforderung ist nicht entscheidend, je nach Schwierigkeitsgrad)

Ich versuche herauszufinden, was der beste Weg wäre, dies zu erreichen.Meine erste Schätzung wäre mit einem regulären Ausdruck, aber meine regex Fähigkeiten schlecht sind bestenfalls so würde ich weiß wirklich nicht, wo ich anfangen soll.

Meine andere Idee Schleife sein würde und die Daten analysieren, sagen sie es brechen in Worte, jedes analysieren und wieder aufgebaut die string das Weg.

Oder gibt es einen anderen Weg, auf dem ich das tun könnte?

Antwort

3

Wie wäre es mit einer einfachen Lösung mit Strings.StrConv im Microsoft.VisualBasic-Namespace? (Vergessen Sie nicht, einen Projektverweis auf Microsoft.VisualBasic hinzufügen):

using System; 
using VB = Microsoft.VisualBasic; 


namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine(VB.Strings.StrConv("QUICK BROWN", VB.VbStrConv.ProperCase, 0)); 
      Console.ReadLine(); 
     } 
    } 
} 
+0

Wow! Das ist ein guter ... – Codex

+0

Danke, dass + die anderen Lösungen, um die Behandlung von anderen ungültigen tun es gut gemacht –

0

dachte, es würde Spaß machen, es zu versuchen, hier ist, was ich kam mit:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      StringBuilder sb = new StringBuilder(); 
      string sentence = "123The_quIck bROWN FOX1234"; 

      sentence = sentence.ToLower(); 

      char[] s = sentence.ToCharArray(); 

      bool atStart = true; 
      char pChar = ' '; 

      char[] spaces = { ' ', '_', '-' }; 
      char a; 
      foreach (char c in s) 
      { 
       if (atStart && char.IsDigit(c)) continue; 

       if (char.IsLetter(c)) 
       { 
        a = c; 
        if (spaces.Contains(pChar)) 
         a = char.ToUpper(a); 
        sb.Append(a); 
        atStart = false; 
       } 
       else if(char.IsDigit(c)) 
       { 
        sb.Append(c); 
       } 
       pChar = c; 
      } 

      Console.WriteLine(sb.ToString()); 
      Console.ReadLine(); 
     } 
    } 
} 
+0

Herrje, ich glaube, du und ich kam fast genau an der gleichen Stelle! –

1

Diese Regex alle Wörter entspricht. Dann wir Aggregate sie mit einer Methode, die die ersten Zeichen groß schreibt, und ToLower s den Rest der Zeichenfolge.

Regex regex = new Regex(@"[a-zA-Z]*", RegexOptions.Compiled); 

private string CamelCase(string str) 
{ 
    return regex.Matches(str).OfType<Match>().Aggregate("", (s, match) => s + CamelWord(match.Value)); 
} 

private string CamelWord(string word) 
{ 
    if (string.IsNullOrEmpty(word)) 
     return ""; 

    return char.ToUpper(word[0]) + word.Substring(1).ToLower(); 
} 

Diese Methode ignoriert übrigens Zahlen. Um sie hinzuzufügen, können Sie die Regex in @"[a-zA-Z]*|[0-9]*" ändern, nehme ich an - aber ich habe es nicht getestet.

1

Jede Lösung, die mit einigen Zeichencodierungen können nicht gut funktionieren bestimmte Zeichen beinhaltet passende, vor allem, wenn Unicode-Darstellung verwendet wird, das hat Dutzende von Leerzeichen, Tausende von "Symbolen", Tausende von Interpunktionszeichen, Tausende von "Buchstaben" usw. Es wäre besser, wo immer möglich integrierte Unicode-Funktionen zu verwenden. In Bezug darauf, was ein "besonderer Charakter" ist, können Sie basierend auf entscheiden. Zum Beispiel würde es "Interpunktion" beinhalten, aber würde es "Symbole" beinhalten?

ToLower(), IsLetter(), usw. sollte in Ordnung sein, und berücksichtigen Sie alle möglichen Buchstaben in Unicode. Die Übereinstimmung mit Bindestrichen und Schrägstrichen sollte wahrscheinlich einige der Dutzenden von Leerzeichen und Gedankenstrichen in Unicode berücksichtigen.

1

Sie könnten wear ruby slippers to work :)

def camelize str 
    str.gsub(/^[^a-zA-z]*/, '').split(/[^a-zA-Z0-9]/).map(&:capitalize).join 
end