22

文字列を取得し、その中の単語を大文字にする必要があります。特定の単語 ("in"、"at" など) は大文字ではなく、検出された場合は小文字に変更されます。最初の単語は常に大文字にする必要があります。「McFly」のような姓は現在のスコープにないため、同じ規則が適用されます - 最初の文字のみが大文字になります。

例: 「of mouse and men By CNN」は「Of Mice and Men by CNN」に変更する必要があります。(したがって、ToTitleString はここでは機能しません。)

それを行う最善の方法は何ですか?

文字列をスペースで分割し、各単語を調べて、必要に応じて変更し、前の単語に連結するなどを考えました。それはかなり素朴なようで、それを行うためのより良い方法があるかどうか疑問に思っていました. .NET 3.5 を使用しています。

4

10 に答える 10

20

使用する

Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase("of mice and men By CNN");

適切な大文字と小文字に変換すると、前述のようにキーワードをループできます。

于 2010-11-30T15:50:32.503 に答える
19

大文字化を行う予定の頻度に応じて、単純なアプローチを使用します。正規表現でそれを行うこともできますが、特定の単語を大文字にしたくないという事実は、それを少しトリッキーにします.

正規表現を使用して 2 つのパスで実行できます。

var result = Regex.Replace("of mice and men isn't By CNN", @"\b(\w)", m => m.Value.ToUpper());
result = Regex.Replace(result, @"(\s(of|in|by|and)|\'[st])\b", m => m.Value.ToLower(), RegexOptions.IgnoreCase);

これは を出力しますOf Mice and Men Isn't by CNN

最初の式は、単語境界のすべての文字を大文字にし、2 番目の式は、空白で囲まれたリストに一致するすべての単語を小文字にします。

このアプローチの欠点は、正規表現を使用していることです (現在、2 つの問題があります)。除外された単語のリストを最新の状態に保つ必要があります。私の regex-fu は、1 つの式で実行できるほど十分ではありませんが、可能かもしれません。

于 2010-11-30T15:48:58.167 に答える
8

別の質問からの回答、名前を大文字にする方法-

CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;
TextInfo textInfo = cultureInfo.TextInfo;

Console.WriteLine(textInfo.ToTitleCase(title));
Console.WriteLine(textInfo.ToLower(title));
Console.WriteLine(textInfo.ToUpper(title));
于 2013-03-05T16:09:31.723 に答える
4

ToTitleCase()最初に使用してから、該当する単語のリストを保持しReplace、それらの該当する単語のすべて小文字のバージョンに戻ります (リストが小さい場合)。

.ToLower()該当する単語のリストを辞書に保持し、かなり効率的にループして、同等の単語に置き換えることができます。

于 2010-11-30T15:54:08.997 に答える
2

次のようなことを試してください:

public static string TitleCase(string input, params string[] dontCapitalize) {
   var split = input.Split(' ');
   for(int i = 0; i < split.Length; i++)
        split[i] = i == 0 
          ? CapitalizeWord(split[i]) 
          : dontCapitalize.Contains(split[i])
             ? split[i]
             : CapitalizeWord(split[i]);
   return string.Join(" ", split);
}
public static string CapitalizeWord(string word)
{
    return char.ToUpper(word[0]) + word.Substring(1);
}

CapitalizeWord複雑な姓を処理する必要がある場合は、後でメソッドを更新できます。これらのメソッドをクラスに追加し、次のように使用します。

SomeClass.TitleCase("a test is a sentence", "is", "a"); // returns "A Test is a Sentence"
于 2010-11-30T15:58:50.573 に答える
1

最も簡単な解決策 (英文の場合) は次のようになります。

  • "sentence".Split(" ")空白文字に関する文
  • 各アイテムをループする
  • 各項目の最初の文字を大文字にする - item[i][0].ToUpper(),
  • スペースで結合された文字列に再マージします。
  • このプロセスを「。」で繰り返します。と "," その新しい文字列を使用します。
于 2010-11-30T15:49:19.337 に答える
1

無視したい単語を含む Dictionary を作成し、文をフレーズ (.split(' ')) に分割し、各フレーズについて、フレーズが辞書に存在するかどうかを確認し、存在しない場合は最初の文字を大文字にすることができます。次に、文字列を文字列バッファーに追加します。現在処理しているフレーズが辞書にある場合は、それを文字列バッファーに追加するだけです。

于 2010-11-30T15:50:57.403 に答える
1

単純なケースを処理する巧妙でないアプローチ:

var s = "of mice and men By CNN";
var sa = s.Split(' ');
for (var i = 0; i < sa.Length; i++)
    sa[i] = sa[i].Substring(0, 1).ToUpper() + sa[i].Substring(1);
var sout = string.Join(" ", sa);
Console.WriteLine(sout);
于 2010-11-30T15:53:13.893 に答える
0

説明しているように、独自の関数を作成する必要があります。

于 2010-11-30T15:49:13.030 に答える