0

文字列の正規化を行う必要があるコードを書いています。特定の文字列をキャメル ケース表現に変換したいと考えています (まあ、少なくとも最善の推測では)。例:

"the quick brown fox" => "TheQuickBrownFox"
"the_quick_brown_fox" => "TheQuickBrownFox"
"123The_quIck bROWN FOX" => "TheQuickBrownFox"
"the_quick brown fox 123" => "TheQuickBrownFox123"
"thequickbrownfox" => "Thequickbrownfox"

これらの例からアイデアを得ることができるはずだと思います。すべての特殊文字 ('、"、!、@、. など) を取り除き、すべての単語を大文字にし (単語はスペース、_ または - で定義されます)、先頭の数字を削除します (末尾/内部は問題ありませんが、難易度によっては、この要件は重要ではありません)。

これを達成するための最良の方法は何かを考え出そうとしています。私の最初の推測は正規表現ですが、私の正規表現のスキルはせいぜい下手なので、どこから始めればよいかわかりません。

私の他のアイデアは、データをループして解析し、単語に分解し、それぞれを解析し、そのように文字列を再構築することです。

または、私がそれについて行くことができる別の方法はありますか?

4

5 に答える 5

3

Microsoft.VisualBasic 名前空間でStrings.StrConvを使用する簡単なソリューションはどうですか? (プロジェクト参照を Microsoft.VisualBasic に追加することを忘れないでください):

using System;
using VB = Microsoft.VisualBasic;


namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(VB.Strings.StrConv("QUICK BROWN", VB.VbStrConv.ProperCase, 0));
            Console.ReadLine();
        }
    }
}
于 2009-03-03T02:20:38.083 に答える
1

この正規表現はすべての単語に一致します。次に、Aggregate最初の文字を大文字にしToLower、残りの文字列を s にするメソッドを使用してそれらを変換します。

Regex regex = new Regex(@"[a-zA-Z]*", RegexOptions.Compiled);

private string CamelCase(string str)
{
    return regex.Matches(str).OfType<Match>().Aggregate("", (s, match) => s + CamelWord(match.Value));
}

private string CamelWord(string word)
{
    if (string.IsNullOrEmpty(word))
        return "";

    return char.ToUpper(word[0]) + word.Substring(1).ToLower();
}

ちなみに、このメソッドは数字を無視します。それらを追加するには、正規表現を に変更できますが、@"[a-zA-Z]*|[0-9]*"テストしていません。

于 2009-03-03T02:15:24.570 に答える
1

あなたは仕事にルビーのスリッパを履くことができます:)

def camelize str
  str.gsub(/^[^a-zA-z]*/, '').split(/[^a-zA-Z0-9]/).map(&:capitalize).join
end
于 2009-03-03T04:08:53.423 に答える
1

特定の文字の一致を伴うソリューションは、特に、数十の空白文字、数千の「記号」、数千の句読点文字、数千の「文字」などを含む Unicode 表現が使用されている場合、一部の文字エンコーディングではうまく機能しない可能性があります。可能な限り、組み込みの Unicode 対応関数を使用することをお勧めします。「特殊文字」とは何かに関しては、 Unicode カテゴリに基づいて決定できます。たとえば、「句読点」は含まれますが、「記号」は含まれますか?

ToLower()、IsLetter() などは問題なく、Unicode で可能なすべての文字を考慮に入れる必要があります。ダッシュとスラッシュとの照合では、おそらく Unicode の多数のスペースとダッシュ文字のいくつかを考慮に入れる必要があります。

于 2009-03-03T02:36:40.867 に答える
0

やってみると面白いと思ったのですが、以下のように考えました。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            StringBuilder sb = new StringBuilder();
            string sentence = "123The_quIck bROWN FOX1234";

            sentence = sentence.ToLower();

            char[] s = sentence.ToCharArray();

            bool atStart = true;
            char pChar = ' ';

            char[] spaces = { ' ', '_', '-' };
            char a;
            foreach (char c in s)
            {
                if (atStart && char.IsDigit(c)) continue;

                if (char.IsLetter(c))
                {
                    a = c;
                    if (spaces.Contains(pChar))
                        a = char.ToUpper(a);
                    sb.Append(a);
                    atStart = false;
                }
                else if(char.IsDigit(c))
                {
                    sb.Append(c);
                }
                pChar = c;
            }

            Console.WriteLine(sb.ToString());
            Console.ReadLine();
        }
    }
}
于 2009-03-03T02:11:41.240 に答える