2014年08月10日

C#で文字列に含まれる単語の最初の文字を大文字にする

   このエントリーをはてなブックマークに追加 Clip to Evernote
どう書く?orgに感謝を込めて」シリーズ その32

■問題
文字列に含まれる単語について、それぞれの単語の最初の文字を大文字にしてください。 たとえば、"LL future" と与えられたときは "LL Future" と出力します。
"LL day and night" と与えられたときは "LL Day And Night" と出力します。
与えられる文字列はリテラルで表記する、標準入力で与えられる、引数で与えられるなどは自由とします。
出展: http://ll.jus.or.jp/2008/program/doukaku.html

この問題は、単語をどう認識するのかでコードが変わってきますね。
単純に空白で区切られているもの とするのか、もうすこし厳密にやるのか。
後者は正規表現使うことになりますね。
ここでは、空白で区切られているとした場合のコードを2つ、正規表現で定義された単語のケースを1つ 書いてみました。

■C#で書いたコード (その1)
using System;
using System.Text;
using System.Threading;
using System.Globalization;

namespace Doukaku.Org {
    class Program {
        static void Main(string[] args) {
            Console.WriteLine(ToUpper1St("LL day and night"));
            Console.WriteLine(ToUpper1St("LL future"));
            Console.WriteLine(ToUpper1St("Microsoft   windows  server."));
            Console.WriteLine(ToUpper1St("hello, i am a cat"));
            Console.WriteLine(ToUpper1St("日本語abc漢字"));
            Console.WriteLine(ToUpper1St("αβγ"));
            Console.WriteLine(ToUpper1St("abc"));
            Console.WriteLine(ToUpper1St("a=b+c"));
            string s = ToUpper1St("een");
            Console.WriteLine(ToUpper1St("een"));
            Console.ReadLine();
        }

        static string ToUpper1St(string s) {
            var words = s.Split(' ');
            StringBuilder sb = new StringBuilder();
            foreach (var word in words) {
                sb.Append(ToTitleCase(word) + " ");
            }
            return sb.ToString().TrimEnd(' ');
        }

        static string ToTitleCase(string s) {
            CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;
            TextInfo textInfo = cultureInfo.TextInfo;
            return textInfo.ToTitleCase(s);
        }
    }
}
■C#で書いたコード (その2)
using System;
using System.Text;
using System.Threading;

namespace Doukaku.Org {
    class Program {
        static void Main(string[] args) {

            ... 省略 ...
        }

        static string ToUpper1St(string s) {
            StringBuilder sb = new StringBuilder();
            char prev = ' ';
            foreach (var c in s) {
                if (Char.IsWhiteSpace(prev) && Char.IsLower(c))
                    sb.Append(Char.ToUpper(c));
                else
                    sb.Append(c);
                prev = c;
            }
            return sb.ToString();
        }
    }
}
■C#で書いたコード (その3)
using System;
using System.Text;
using System.Threading;
using System.Globalization;
using System.Text.RegularExpressions;

namespace Doukaku.Org {
    class Program {
        static void Main(string[] args) {
            ... 省略 ...
        }

        // \W : 単語に使用される文字以外の任意の文字と一致します。
        // \w : 単語に使用される任意の文字と一致します。
        static string ToUpper1St(string s) {
            var reg = new Regex("(\\W*)(\\w+)");
            return reg.Replace(s, (m) => m.Groups[1] + ToTitleCase(m.Groups[2].Value));
        }

        static string ToTitleCase(string s) {
            CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;
            TextInfo textInfo = cultureInfo.TextInfo;
            return textInfo.ToTitleCase(s);
        }

    }
}


 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/52379835