2014-01-07 4 views
8

Gegeben eine beliebige Zeichenfolge, ich möchte ein intelligentes Akronym erstellen, das die Zeichenfolge darstellt. Wenn jemand von euch JIRA benutzt hat, dann schaffen sie das ziemlich gut.C# Erstellen Sie ein Akronym aus Word

Zum Beispiel gegeben das Wort: Phoenix es PHX oder verschenkt das Wort Datenschutz Event Management es schaffen würde erzeugen würde PEM.

Ich habe einig Code für Sie, letztere erreichen wird:

string.Join(string.Empty, model.Name 
       .Where(char.IsLetter) 
       .Where(char.IsUpper)) 

Dieser Fall nicht behandelt, wenn es entweder nur ein Wort und sein unterer Fall ist.

aber es berücksichtigt nicht den ersten Fall. Irgendwelche Ideen? Ich verwende C# 4.5

+0

Was sind die Regeln für den ersten Fall? Immer erster, zweiter, letzter Char? Und welche Regeln gibt es, um diese Fälle zu unterscheiden? – okrumnow

+8

Nur ein bisschen Englisch: Es ist ein Akronym, wenn es ausgesprochen wird (NASA oder Marvels SHIELD). Sie sind Initialisierungen, wenn Sie den ersten Buchstaben von jedem Wort nehmen, aber nicht aussprechen (wie CIA oder NSA) und Abkürzungen, wenn Sie ein Wort verkürzen (wie Ihr erstes Beispiel oder EXT für das Äußere). –

+0

@okrumnow Ich habe keine spezifischen Regeln, ich habe das nur als Beispiel für ein wünschenswertes Ergebnis verwendet. – amcdnl

Antwort

1

konnte ich den JIRA Schlüsselgenerator extrahieren und entsandte sie here. ziemlich interessant, und obwohl sein JavaScript es könnte leicht in C# umgewandelt werden.

3

Für den Phoenix => PHX, denke ich, dass Sie die Zeichenfolgen gegen ein Wörterbuch der bekannten Abkürzungen überprüfen müssen. Wie für die Unterstützung mehrerer Wörter/camel-case, Regex ist dein Freund!

var text = "A Big copy DayEnergyFree good"; // abbreviation should be "ABCDEFG" 
var pattern = @"((?<=^|\s)(\w{1})|([A-Z]))"; 
string.Join(string.Empty, Regex.Matches(text, pattern).OfType<Match>().Select(x => x.Value.ToUpper())) 

Lassen Sie mich erklären, was hier passiert, mit dem RegexMuster beginnen, die für die passenden Teil einige Fälle abdeckt.

// must be directly after the beginning of the string or line "^" or a whitespace character "\s" 
(?<=^|\s) 
// match just one letter that is part of a word 
(\w{1}) 
// if the previous requirements are not met 
| 
// match any upper-case letter 
([A-Z]) 

Regex.Matches Die Methode gibt einen Match, die im Grunde eine ICollection ist so LINQ Ausdrücke zu verwenden, rufen wir OfType(), um das Match in eine IEnumerable zu konvertieren.

Regex.Matches(text, pattern).OfType<Match>() 

Dann wählen wir nur den Wert des Spiels (wir brauchen nicht die anderen regex passenden Meta-Daten) und in Großbuchstaben umwandeln.

Select(x => x.Value.ToUpper()) 
+0

Wow .. . das ist großartig! Danke auch für die Erklärung! – amcdnl