Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите 
:(
    Опции темы
AndreSan
Дата 29.5.2009, 00:43 (ссылка)  | (голосов:6) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 29.5.2009

Репутация: нет
Всего: нет



Помогите как подсчитать количество слов в тексте в C#? если дана стринговская строка?
PM MAIL   Вверх
Partizan
Дата 29.5.2009, 02:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 8
Всего: 67



google string.Split


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
kuller
Дата 29.5.2009, 08:30 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 15.11.2007

Репутация: нет
Всего: нет



AndreSan, Удаляй со строки первым делом все лишние ПРОБЕЛЫ, а затем при помощи Split бей строку по ПРОБЕЛАМ, таким образом ты получишь МАССИВ, длина которго и будет количество слов в строке.
 

Это сообщение отредактировал(а) kuller - 29.5.2009, 08:31
PM MAIL   Вверх
azesmcar
Дата 29.5.2009, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 2
Всего: 211



Код

string str = "hello world";
int count = str.Split(new char[]{ ' ' }).Length;

PM   Вверх
diadiavova
Дата 29.5.2009, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 18
Всего: 142



Думаю, что простой String.Split в данном случае может преподнести ряд сюрпризов. Во-первых: слова в тексте могут разделяться не только пробелами, но и переходами строк(например). Во-вторых: Не во всех текстах соблюдаются все правила форматирования, то есть, если например вместо пробела будет использована табуляция или несколько пробелов, если вопреки правилам знаки препинания будут использоваться вместо пробелов или отделяться пробелами с обеих сторон, во всех этих случаях будет получен неверный результат.
ИМХО - в данном случае более целесообразно воспользоваться методом System.Text.RegularExpressions.Regex.Split

Код

int count = System.Text.RegularExpressions.Regex.Split(str, @"^\W+$").Length;

Вот как-то так.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Partizan
Дата 29.5.2009, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 8
Всего: 67



да просто в string.Split надо передать массив разделителей ...и все дела..


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
diadiavova
Дата 29.5.2009, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 18
Всего: 142



Вот такой незатейливый код
Код

        static void Main(string[] args)
        {
            string str = "Hellow , world!";
            Console.Write(str.Split(' ',',', '!').Length.ToString());
            Console.ReadKey();
        }

выводит на консоль 5(проверено).
Кроме того: приходится перечислять все возможные разделители. Я уже не говорю о том, что словом в тексте может считаться и более сложная конструкция(например как считать Syste.String одним словом или нет?), и с регекспами можно немного поменять код (использовать Matches вместо Split, что в общем-то надо было сделать с самого начала...ступил) и проблема легко решится.


Это сообщение отредактировал(а) diadiavova - 29.5.2009, 13:53


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
diadiavova
Дата 29.5.2009, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 18
Всего: 142



Хотя, конечно, можно сделать и так
Код

        static void Main(string[] args)
        {
            string str = "Hellow , world!";
            string[] sep = {" ",",","!" };
            Console.Write(str.Split(sep,StringSplitOptions.RemoveEmptyEntries).Length.ToString());
            Console.ReadKey();
        }

Но от необходимости перечисления всех возможных разделителей это не избавляет. smile 


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
PashaPash
Дата 29.5.2009, 14:36 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 9
Всего: 49



Хакеры.
Код

            string str = "Hellow , world!";
            Console.Write(Regex.Matches(str, @"\b").Count / 2);
            Console.ReadKey();



--------------------
PM MAIL WWW   Вверх
diadiavova
Дата 30.5.2009, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 18
Всего: 142



Вообще-то: рекомендовать конкретный шаблон регулярного выражения в данном случае несколько преждевременно. Сначала неплохо было бы выяснить у топикастера насколько строг формат входной строки и по каким признакам следует выявлять слова. Есть некоторые сомнения по поводу корректности результатов, которые можно получить с помощью способа, предложенного PashaPash, например в случае, если в тексте появятся строки вроде этих

Код

Ту-144
3,14159
6,673E-11
30.05.2009
+7(495)1234567
+7(812)123-4-321
когда-нибудь
сту́пень
обов'язково


Поэтому считать, что проблему можно решить для всех случаев паттерном из одного спецсимвола, на мой взгляд - слишком смело. 
Хотя, есть подозрение, что топикастеру это не нужно и тем не менее...

Это сообщение отредактировал(а) diadiavova - 30.5.2009, 22:33


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
source777
Дата 1.6.2009, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 3
Всего: 56



Цитата(diadiavova @  30.5.2009,  22:30 Найти цитируемый пост)
Поэтому считать, что проблему можно решить для всех случаев паттерном из одного спецсимвола, на мой взгляд - слишком смело. 

В любом случае, я считаю метод предложенный PashaPash, единственным разумным из предложенных здесь, т.к. я лично не понял нафига здесь Split, когда нужно подсчитать количество слов. Единственное что требуется уточнить так это понятие слова, если в рамках задачи это понятие не совпадает с понятием слова используемом в регулярных выражениях(\b - граница слова), то правильным решением будет:
Код

var pattern = @"[a-zA-Zа-яёА-ЯЁ-]+"; // шаблон для слова в рамках конкретной задачи
var count = Regex.Matches(str, pattern).Count;



--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
diadiavova
Дата 1.6.2009, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 18
Всего: 142



source777, после того, как все в один голос стали писать о том, что проблема решается методом стрингсплит, я обратил внимание на тот факт, что  результаты, выдаваемые им будут далеко не всегда корректными, и что в данном случае целесообразно использовать регекспы. Код, приведённый мной в том посте был всего-навсего примером. Далее я упомянул и об использовании Matches(если ты заметил, конечно). Код, предложенный PashaPash - совсем не плох, если не считать того обстоятельства, что единственным, содержащимся в нём новшеством был именно шаблон, о недостатках которого я и написал. А что использовать Split или  Matches - это вообще дело вкуса(и конкретных обстоятельств ессно).

Добавлено через 6 минут и 37 секунд
И кстати если конкретная задача подразумевает, что слова состоят только из алфавитных символов(без цифр), то можно сделать так
Код

[\w-[\d]]+



--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
source777
Дата 1.6.2009, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 3
Всего: 56



Цитата(diadiavova @  1.6.2009,  22:51 Найти цитируемый пост)
Далее я упомянул и об использовании Matches(если ты заметил, конечно)
Не заметил, надо было в коде упомянуть...  smile 


Цитата(diadiavova @  1.6.2009,  22:51 Найти цитируемый пост)
А что использовать Split или  Matches - это вообще дело вкуса(и конкретных обстоятельств ессно).
Split`у нужно указывать именно разделители, в этом есть разница.



--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
diadiavova
Дата 1.6.2009, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 18
Всего: 142



Цитата(source777 @  1.6.2009,  23:37 Найти цитируемый пост)
Не заметил, надо было в коде упомянуть...

Берёшься спорить - читай всё smile 

Цитата(source777 @  1.6.2009,  23:37 Найти цитируемый пост)
Split`у нужно указывать именно разделители, в этом есть разница.

Из моего предыдущего шаблона. Вот, что надо указать Matches
Код

[\w-[\d]]+

И вот, что сплиту
Код

[^\w-[\d]]+

Что называется "почувствуйте разницу". Кроме того сплит возвращает строковый массив, а иногда нужен именно он. Так что разница не только в том, о чём упомянул ты.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Partizan
Дата 2.6.2009, 01:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 8
Всего: 67



Да, исходя из постановки задачи решение с Regex.Matches выглядит более правильным smile
Я изначально предложил string.Split, ибо синтаксиса построения регулярных выражений особо не знаю smile


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0972 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.