8

この質問をベースとして使用して、一部のテキストを Pascal または Camel ケーシングに変更するためのアルゴリズムまたはコーディング例があります。

例えば:

mynameisfred

になる

Camel: myNameIsFred
Pascal: MyNameIsFred
4

2 に答える 2

3

http://www.perlmonks.org/?node_id=336331で、この質問について議論している多くのPerlの人たちがいるスレッドを見つけました。

これが質問に対するあまりの非回答ではないことを願っていますが、それは非常にオープンエンドのアルゴリズムであり、多くの「ミス」もある可能性があるという点で、少し問題があると思いますヒットとして。たとえば、次のように入力したとします。-

camelCase("hithisisatest");

出力は次のようになります。-

"hiThisIsATest"

または:-

"hitHisIsATest"

アルゴリズムがどちらを優先するかを知る方法はありません。より一般的な単語を好むことを指定するためにいくつかのコードを追加することもできますが、やはりミスが発生します(Peter Norvigはhttp://norvig.com/spell-correct.htmlで非常に小さなスペル修正プログラムを作成しました。これは、アルゴリズムに役立つ可能性があります。 -賢明なことに、C#があなたの言語であれば、私はC#の実装を書きました)。

私はMarkに同意し、区切られた入力を受け取るアルゴリズム、つまりthis_is_a_testを使用して、それを変換する方がよいと言います。これは簡単に実装できます。つまり、擬似コードで:-

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)]

必要に応じて、capitaliseFirstLetter()関数を適切なケースアルゴリズムに置き換えることもできます。

上記のアルゴリズムのAC#実装は次のとおりです(テストハーネスを備えた完全なコンソールプログラム):-

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);
  }
}
于 2008-08-28T14:34:55.863 に答える
0

これを行う唯一の方法は、単語の各セクションを辞書で調べることです。

「mynameisfred」は単なる文字の配列であり、それを my Name Is Fred に分割することは、これらの各文字の結合が何を意味するかを理解することを意味します。

「my name is fred」や「my_name_is_fred」など、入力が何らかの方法で区切られていれば、簡単に実行できます。

于 2008-08-28T13:33:49.100 に答える