2010-08-02 5 views
14

Ich brauche eine Funktion, die eine Zeichenfolge und "Pascal Case" es nehmen wird. Der einzige Hinweis darauf, dass ein neues Wort beginnt, ist ein Unterstrich. Hier sind einige Beispiel-Strings, die gereinigt werden müssen:Funktion Pascal Fall zu machen? (C#)

  1. price_old => Sollte PriceOld
  2. rank_old = werden> RankOld werden sollte

Ich begann auf einer Funktion arbeiten, die das erste Zeichen macht Großbuchstaben:

public string FirstCharacterUpper(string value) 
{ 
if (value == null || value.Length == 0) 
    return string.Empty; 
if (value.Length == 1) 
    return value.ToUpper(); 
var firstChar = value.Substring(0, 1).ToUpper(); 
return firstChar + value.Substring(1, value.Length - 1); 
} 

die Sache die obige Funktion nicht tun, ist es, den Unterstrich und „ToUpper“ das Zeichen rechts von dem Unterstrich entfernen.

Auch irgendwelche Ideen darüber, wie man eine Zeichenfolge pascal, die keine Indikatoren (wie der Unterstrich) hat. Zum Beispiel:

  1. companysource
  2. financialtrend
  3. accountingchangetype

Die große Herausforderung hier ist die Bestimmung, wo ein Wort endet und eine andere beginnt. Ich denke, ich würde ein Nachschlagewörterbuch benötigen, um zu bestimmen, wo neue Wörter anfangen? Gibt es da Bibliotheken, die solche Dinge schon tun?

Danke,

Paul

+4

Eine kurze Bemerkung eine nicht regex Lösung braucht - das ist Pascal Fall. Der Kamelfall beginnt mit einem Kleinbuchstaben, z. 'rankOld'. –

+1

@ Jon O, gut zu wissen ... updating ... –

+1

Ein weiterer schneller Kommentar - es ist nicht notwendig, eine Länge anzugeben, wenn Sie den gesamten Teilstring von einem bestimmten Startpunkt wollen. Also statt value.Substring (1, value.Length - 1) kannst du einfach value.Substring (1) machen. – Anton

Antwort

23

Sie können die Methode TextInfo.ToTitleCase verwenden und dann die Zeichen '_' entfernen.

So, die Erweiterungsmethoden verwenden, was ich habe:

http://theburningmonk.com/2010/08/dotnet-tips-string-totitlecase-extension-methods

Sie können diese somethingl ike tun:

var s = "price_old"; 
s.ToTitleCase().Replace("_", string.Empty); 
+0

Interessanter Ansatz! –

+0

@theburningmonk Ich mag, was ich bis jetzt sehe ... könnte am Ende mit diesem Ansatz enden. –

+0

@theburningmonk Es funktioniert wie ein Zauber! Danke noch einmal. –

11

Nun, die erste Sache ist einfach:

string.Join("", "price_old".Split(new [] { '_' }, StringSplitOptions.RemoveEmptyEntries).Select(s => s.Substring(0, 1).ToUpper() + s.Substring(1)).ToArray()); 

kehrt PriceOld

Die zweite Sache ist viel schwieriger. Als companysource könnte CompanySource oder vielleicht CompanysOurce sein, kann automatisiert werden, ist aber ziemlich fehlerhaft. Sie werden eine English dictionary benötigen, und etwas raten (ah gut, ich meine viel) auf welche Kombination von Wörtern korrekt ist.

+0

Wie Sie so effektiv gezeigt haben, ist der Umgang mit Wörtern schwierig. Ich denke, es gibt keinen Weg, ich werde eine Art Wörterbuchsuche machen müssen. Ich glaube, ich hatte gehofft, dass jemand schon etwas entwickelt hat, was ich benutzen könnte. –

+0

+1: zum Aufzeigen der Wörterbuchlösung für * zweite Sache * –

4

Try this:

public static string GetPascalCase(string name) 
{ 
    return Regex.Replace(name, @"^\w|_\w", 
     (match) => match.Value.Replace("_", "").ToUpper()); 
} 

Console.WriteLine(GetPascalCase("price_old")); // => Should be PriceOld 
Console.WriteLine(GetPascalCase("rank_old")); // => Should be RankOld 
+0

Nur das ist viermal so langsam wie nur das Teilen und Substringing, und doppelt so langsam beim Kompilieren der Regex (100.000 Mal). –

+2

Kann ich Ihren Benchmark @Jan haben? –

1

mit Unterstrichen :

Ohne Unterstrichen:

Sie es auf eigene Faust.Aber gehen Sie weiter und suchen Sie; Ich würde mich wundern, wenn niemand dies vorher getan hat.

0

Für Ihr zweites Problem der Aufspaltung verketteter Wörter können Sie unsere besten Freunde verwenden Google & Co. Wenn Ihre verkettete Eingabe aus üblichen englischen Wörtern besteht, haben die Suchmaschinen eine gute Trefferquote für die einzelnen Wörter als Alternative Suchbegriff

Wenn Sie Ihre Probeneingabe eingeben, Google und Bing vorschlagen folgende:

original    | Google    | Bing 
===================================================================== 
companysource  | company source  | company source 
financialtrend  | financial trend  | financial trend 
accountingchangetype | accounting changetype | accounting change type 

this exaple See.

Schreiben Sie einen kleinen Bildschirm Schaber für das sollte ziemlich einfach sein.

+0

http://stackoverflow.com/questions/3856630/how-to-separate-words-in-a-sentence-with-spaces - 8 Zeilen für ein Shell-Skript. –

0

für diejenigen, die

public static string RemoveAllSpaceAndConcertToPascalCase(string status) 
     { 
      var textInfo = new System.Globalization.CultureInfo("en-US").TextInfo; 
      var titleCaseStr = textInfo.ToTitleCase(status); 
      string result = titleCaseStr.Replace("_","").Replace(" ", ""); 

      return result; 
     }