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