質問

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

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

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

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

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

または、他の方法でそれを実行できますか?

役に立ちましたか?

解決

Strings.StrConvを使用した簡単なソリューションについてはMicrosoft.VisualBasic名前空間にありますか? (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();
        }
    }
}

他のヒント

この正規表現はすべての単語に一致します。次に、最初の文字を大文字にするメソッドで 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();
}

この方法は、数字を無視します。それらを追加するには、正規表現を @&quot; [a-zA-Z] * | [0-9] *&quot; に変更します。ただし、テストしていません。

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

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

ルビーのスリッパを着用して作業する:)

def camelize str
  str.gsub(/^[^a-zA-z]*/, '').split(/[^a-zA-Z0-9]/).map(&:capitalize).join
end

試してみるのは楽しいと思ったので、ここに私が思いついたものがあります:

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();
        }
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top