Frage

Mit dieser Frage Als Basis gibt es einen Algorithmus oder ein Codierungsbeispiel, um einen Text in Pascal- oder Camel-Schreibweise umzuwandeln.

Zum Beispiel:

mynameisfred

wird

Camel: myNameIsFred
Pascal: MyNameIsFred
War es hilfreich?

Lösung

Ich habe einen Thread gefunden, in dem ein paar Perl-Leute über diese Frage streiten http://www.perlmonks.org/?node_id=336331.

Ich hoffe, dass dies keine allzu große Antwort auf die Frage ist, aber ich würde sagen, Sie haben ein kleines Problem, da es sich um einen sehr offenen Algorithmus handelt, der auch viele „Fehler“ haben könnte als Treffer.Angenommen, Sie haben Folgendes eingegeben:

camelCase("hithisisatest");

Die Ausgabe könnte sein:-

"hiThisIsATest"

Oder:-

"hitHisIsATest"

Es gibt keine Möglichkeit, dass der Algorithmus weiß, was er bevorzugen soll.Sie könnten etwas zusätzlichen Code hinzufügen, um anzugeben, dass Sie gebräuchlichere Wörter bevorzugen würden, aber auch hier würde es zu Fehlern kommen (Peter Norvig hat drüben bei … eine sehr kleine Rechtschreibkorrektur geschrieben). http://norvig.com/spell-correct.html welche könnte Was den Algorithmus angeht, habe ich eine geschrieben C#-Implementierung wenn C# Ihre Sprache ist).

Ich würde Mark zustimmen und sagen, dass Sie besser dran wären, einen Algorithmus zu haben, der eine durch Trennzeichen getrennte Eingabe akzeptiert, d. h.this_is_a_test und konvertiert das.Das wäre einfach umzusetzen, d.h.im Pseudocode:-

SetPhraseCase(phrase, CamelOrPascal):
    if no delimiters
     if camelCase
      return lowerFirstLetter(phrase)
     else
      return capitaliseFirstLetter(phrase)
    words = splitOnDelimiter(phrase)
    if camelCase 
      ret = lowerFirstLetter(first word) 
     else
      ret = capitaliseFirstLetter(first word)
    for i in 2 to len(words): ret += capitaliseFirstLetter(words[i])
    return ret

capitaliseFirstLetter(word):
    if len(word) <= 1 return upper(word)
    return upper(word[0]) + word[1..len(word)]

lowerFirstLetter(word):
    if len(word) <= 1 return lower(word)
    return lower(word[0]) + word[1..len(word)]

Wenn Sie möchten, können Sie meine Funktion „capitaliseFirstLetter()“ auch durch einen geeigneten Algorithmus für Groß- und Kleinschreibung ersetzen.

Eine C#-Implementierung des oben beschriebenen Algorithmus lautet wie folgt (vollständiges Konsolenprogramm mit Testumgebung): –

using System;

class Program {
  static void Main(string[] args) {

    var caseAlgorithm = new CaseAlgorithm('_');

    while (true) {
      string input = Console.ReadLine();

      if (string.IsNullOrEmpty(input)) return;

      Console.WriteLine("Input '{0}' in camel case: '{1}', pascal case: '{2}'",
        input,
        caseAlgorithm.SetPhraseCase(input, CaseAlgorithm.CaseMode.CamelCase),
        caseAlgorithm.SetPhraseCase(input, CaseAlgorithm.CaseMode.PascalCase));
    }
  }
}

public class CaseAlgorithm {

  public enum CaseMode { PascalCase, CamelCase }

  private char delimiterChar;

  public CaseAlgorithm(char inDelimiterChar) {
    delimiterChar = inDelimiterChar;
  }

  public string SetPhraseCase(string phrase, CaseMode caseMode) {

    // You might want to do some sanity checks here like making sure
    // there's no invalid characters, etc.

    if (string.IsNullOrEmpty(phrase)) return phrase;

    // .Split() will simply return a string[] of size 1 if no delimiter present so
    // no need to explicitly check this.
    var words = phrase.Split(delimiterChar);

    // Set first word accordingly.
    string ret = setWordCase(words[0], caseMode);

    // If there are other words, set them all to pascal case.
    if (words.Length > 1) {
      for (int i = 1; i < words.Length; ++i)
        ret += setWordCase(words[i], CaseMode.PascalCase);
    }

    return ret;
  }

  private string setWordCase(string word, CaseMode caseMode) {
    switch (caseMode) {
      case CaseMode.CamelCase:
        return lowerFirstLetter(word);
      case CaseMode.PascalCase:
        return capitaliseFirstLetter(word);
      default:
        throw new NotImplementedException(
          string.Format("Case mode '{0}' is not recognised.", caseMode.ToString()));
    }
  }

  private string lowerFirstLetter(string word) {
    return char.ToLower(word[0]) + word.Substring(1);
  }

  private string capitaliseFirstLetter(string word) {
    return char.ToUpper(word[0]) + word.Substring(1);
  }
}

Andere Tipps

Die einzige Möglichkeit, dies zu erreichen, wäre, jeden Abschnitt des Wortes durch ein Wörterbuch laufen zu lassen.

„meinnameisfred“ ist nur eine Reihe von Zeichen. Wenn man es in „Mein Name ist Fred“ aufteilt, muss man verstehen, was die Verbindung der einzelnen Zeichen bedeutet.

Sie könnten es leicht tun, wenn Ihre Eingabe auf irgendeine Weise getrennt wäre, z. B.„mein Name ist Fred“ oder „mein_name_ist_fred“.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top