web-dev-qa-db-ja.com

文字列C#の単語とスペースを数える

文字列内の単語とスペースを数えたい。文字列は次のようになります。

Command do something ptuf(123) and bo(1).ctq[5] v:0,

今のところこんな感じです

int count = 0;
string mystring = "Command do something ptuf(123) and bo(1).ctq[5] v:0,";
foreach(char c in mystring) 
{
if(char.IsLetter(c)) 
  {
     count++;
  }
}

スペースも数えるにはどうすればよいですか?

10
user2592968
int countSpaces = mystring.Count(Char.IsWhiteSpace); // 6
int countWords = mystring.Split().Length; // 7

どちらも Char.IsWhiteSpace を使用することに注意してください。これは、" "以外の文字を空白(newlineなど)と見なします。備考セクションを見て、どちらが正確かを確認してください。

31
Tim Schmelter

スペースを含むstring.Splitを使用できます http://msdn.Microsoft.com/en-us/library/system.string.split.aspx

文字列配列を取得するとき、要素の数は単語の数であり、スペースの数は単語の数です-1

2
asafrob

これは考慮に入れられます:

  • スペースで開始または終了する文字列。
  • ダブル/トリプル/ ...スペース。

Wordの区切り文字がスペースのみであり、文字列がnullではないと仮定します。

private static int CountWords(string S)
{
    if (S.Length == 0)
        return 0;

    S = S.Trim();
    while (S.Contains("  "))
        S = S.Replace("  "," ");
    return S.Split(' ').Length;
}

注:whileループは正規表現でも実行できます: C#で複数のスペースを1つのスペースに置き換えるにはどうすればよいですか?

1
TTT

スペースをカウントしたい場合は、LINQを使用できます。

int count = mystring.Count(s => s == ' ');
1
Jonesopolis

Timのエントリに加えて、どちらかの側にパディングがある場合、または隣同士に複数のスペースがある場合:

Int32 words = somestring.Split(           // your string
    new[]{ ' ' },                         // break apart by spaces
    StringSplitOptions.RemoveEmptyEntries // remove empties (double spaces)
).Length;                                 // number of "words" remaining
0
Brad Christie

これは正規表現を使用する方法です。検討すべき他の何か。さまざまな種類の空白を多く含む長い文字列がある場合は、より良い方法です。 Microsoft WordのWordCountに似ています。

_var str = "Command do something ptuf(123) and bo(1).ctq[5] v:0,";
int count = Regex.Matches(str, @"[\S]+").Count; // count is 7
_

比較のために、

_var str = "Command     do    something     ptuf(123) and bo(1).ctq[5] v:0,";
_

str.Count(char.IsWhiteSpace)は17ですが、正規表現の数は7のままです。

0
Gray
using namespace;
namespace Application;
class classname
{
    static void Main(string[] args)
    {
        int count;
        string name = "I am the student";
        count = name.Split(' ').Length;
        Console.WriteLine("The count is " +count);
        Console.ReadLine();
    }
}
0
Karthick

文字列内の単語のリストを取得する準備ができたコードを持っています:(拡張メソッド、静的クラスにある必要があります)

    /// <summary>
    /// Gets a list of words in the text. A Word is any string sequence between two separators.
    /// No Word is added if separators are consecutive (would mean zero length words).
    /// </summary>
    public static List<string> GetWords(this string Text, char WordSeparator)
    {
        List<int> SeparatorIndices = Text.IndicesOf(WordSeparator.ToString(), true);

        int LastIndexNext = 0;


        List<string> Result = new List<string>();
        foreach (int index in SeparatorIndices)
        {
            int WordLen = index - LastIndexNext;
            if (WordLen > 0)
            {
                Result.Add(Text.Substring(LastIndexNext, WordLen));
            }
            LastIndexNext = index + 1;
        }

        return Result;
    }

    /// <summary>
    /// returns all indices of the occurrences of a passed string in this string.
    /// </summary>
    public static List<int> IndicesOf(this string Text, string ToFind, bool IgnoreCase)
    {
        int Index = -1;
        List<int> Result = new List<int>();

        string T, F;

        if (IgnoreCase)
        {
            T = Text.ToUpperInvariant();
            F = ToFind.ToUpperInvariant();
        }
        else
        {
            T = Text;
            F = ToFind;
        }


        do
        {
            Index = T.IndexOf(F, Index + 1);
            Result.Add(Index);
        }
        while (Index != -1);

        Result.RemoveAt(Result.Count - 1);

        return Result;
    }


    /// <summary>
    /// Implemented - returns all the strings in uppercase invariant.
    /// </summary>
    public static string[] ToUpperAll(this string[] Strings)
    {
        string[] Result = new string[Strings.Length];
        Strings.ForEachIndex(i => Result[i] = Strings[i].ToUpperInvariant());
        return Result;
    }
0
Daniel Möller