2014-11-24 2 views
0

Я хочу дать моей программе текст и сосчитать слова правильно Я пытался использовать массив, чтобы сохранить слова в нем:как правильно считать слова в тексте

string[] words = richTextBox1.Text.Split(' '); 

Но этот код имеет проблемы и это сосчитать пробелы в тексте поэтому я попытался следующий код:

string[] checkwords= richTextBox1.Text.Split(' '); 
     for (int i = 0; i < checkwords.Length; i++) 
     { 
      if (richTextBox1.Text.EndsWith(" ")) 
      { 
       return; 
      } 

      else 
      { 
       string[] words = richTextBox1.Text.Split(' '); 

       toolStripStatusLabel1.Text = "Words" + " = " + words.Length.ToString(); 

, но теперь она не будет работать правильно.

+4

определить «правильно». Вы считали китайский? Иврит? UTF16? – sehe

+3

покажите пример слов, которые вы также пытаетесь подсчитать .. также вы даже прошли через код ..? очистите/отформатируйте этот код в своем вопросе тоже .. также перечитайте свою логику в своем «коде», вы уже раскалываете richTextBox1.Text, почему вы делаете это снова в строке [] words ..? очень неясно, что вы просите, я голосую, чтобы закрыть – MethodMan

+1

, почему нужно разделить текст, запустить цикл for, а затем прервать цикл, если исходная строка заканчивается пробелом? Тогда в чем смысл повторного разделения текста снова, если в конце нет места? Проверьте, нет ли пробелов, THEN split/count –

ответ

1

Вы можете использовать перегрузку String.Split с StringSplitOptions.RemoveEmptyEntries игнорировать несколько пробелов подряд.

string text = "a b c d"; // 4 "words" 
int words = text.Split(new char[]{}, StringSplitOptions.RemoveEmptyEntries).Length; 

Я использую пустые char[] (вы также можете использовать new string[]{}) потому, что берет на себя все white-space characters во внимание, так что не только ' ', но и вкладки или новой строке символов.

+0

благодарит господина Шмельтера, его легко и это сработало! – user3694495

2

Я бы рекомендовал использовать Regex здесь, используя 'word boundary' якорь

В противном случае ваш код не может правильно принимать во внимание такие вещи, как вкладки и новые линии - \b будет заботиться о том, что для вас

var words = Regex 
    .Split("hello world", @"\b") 
    .Where(s => !string.IsNullOrWhiteSpace(s)); 

var wordCount = words.Count(); 
+0

'+ 1', полагая, что' op' может понять 'RegEx' метод Split()' для новичков легче понять, на мой взгляд, но и хороший ответ – MethodMan

+0

Проблема заключается в вкладах, новых строках и т. Д. - они выиграли 't быть поднятым путем разделения на' ' –

0

Я не знаю, почему вы хотите вернуться, если текстовое поле заканчивается на "". Может быть, он должен быть следующим или продолжать вместо этого.

Если возможно несколько мест.

Regex myRege = new Regex(@"[ ]{2,}");  

string myText = regex.Replace(richTextBox1.Text, @" "); 

string[] words= myText.Split(" "); 

toolStripStatusLabel1.Text = "Words" + " = " + words.Length.ToString(); 

Просто для удовольствия

private string[] GetCount(string bodyText) 
{ 
    bodyText = bodyText.Replace(" "," "); 

    if(bodyText.Contains(" ") 
    GetCount(bodyText) 

    return bodyText.Split(' '); 
} 

string[] words = GetCount(richTextBox1.Text) 

toolStripStatusLabel1.Text = "Words" + " = " + words.Length.ToString(); 
+1

Проблема в том, что Replace вы бы превратили три последовательных пробела в два последовательных пробела, то есть они заменяли только вхождения, найденные за один проход, и не выглядят снова в местоположении он просто заменил. – hatchet

+0

Я как бы подумал, что это будет делать это несколько рекурсивно и проверить, если после замены я могу исправить это с помощью рекурсии ... – DidIReallyWriteThat

Смежные вопросы