![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| AndreSan |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 29.5.2009 Репутация: нет Всего: нет |
Помогите как подсчитать количество слов в тексте в C#? если дана стринговская строка?
|
|||
|
||||
| Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 8 Всего: 67 |
google string.Split
-------------------- СУВ, Partizan. |
|||
|
||||
| kuller |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 15.11.2007 Репутация: нет Всего: нет |
AndreSan, Удаляй со строки первым делом все лишние ПРОБЕЛЫ, а затем при помощи Split бей строку по ПРОБЕЛАМ, таким образом ты получишь МАССИВ, длина которго и будет количество слов в строке.
Это сообщение отредактировал(а) kuller - 29.5.2009, 08:31 |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 2 Всего: 211 |
|
|||
|
||||
| diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 18 Всего: 142 |
Думаю, что простой String.Split в данном случае может преподнести ряд сюрпризов. Во-первых: слова в тексте могут разделяться не только пробелами, но и переходами строк(например). Во-вторых: Не во всех текстах соблюдаются все правила форматирования, то есть, если например вместо пробела будет использована табуляция или несколько пробелов, если вопреки правилам знаки препинания будут использоваться вместо пробелов или отделяться пробелами с обеих сторон, во всех этих случаях будет получен неверный результат.
ИМХО - в данном случае более целесообразно воспользоваться методом System.Text.RegularExpressions.Regex.Split
Вот как-то так. -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
|||
|
||||
| Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 8 Всего: 67 |
да просто в string.Split надо передать массив разделителей ...и все дела..
-------------------- СУВ, Partizan. |
|||
|
||||
| diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 18 Всего: 142 |
Вот такой незатейливый код
выводит на консоль 5(проверено). Кроме того: приходится перечислять все возможные разделители. Я уже не говорю о том, что словом в тексте может считаться и более сложная конструкция(например как считать Syste.String одним словом или нет?), и с регекспами можно немного поменять код (использовать Matches вместо Split, что в общем-то надо было сделать с самого начала...ступил) и проблема легко решится. Это сообщение отредактировал(а) diadiavova - 29.5.2009, 13:53 -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
|||
|
||||
| diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 18 Всего: 142 |
Хотя, конечно, можно сделать и так
Но от необходимости перечисления всех возможных разделителей это не избавляет. -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
|||
|
||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 9 Всего: 49 |
Хакеры.
|
|||
|
||||
| diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 18 Всего: 142 |
Вообще-то: рекомендовать конкретный шаблон регулярного выражения в данном случае несколько преждевременно. Сначала неплохо было бы выяснить у топикастера насколько строг формат входной строки и по каким признакам следует выявлять слова. Есть некоторые сомнения по поводу корректности результатов, которые можно получить с помощью способа, предложенного PashaPash, например в случае, если в тексте появятся строки вроде этих
Поэтому считать, что проблему можно решить для всех случаев паттерном из одного спецсимвола, на мой взгляд - слишком смело. Хотя, есть подозрение, что топикастеру это не нужно и тем не менее... Это сообщение отредактировал(а) diadiavova - 30.5.2009, 22:33 -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
|||
|
||||
| source777 |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1878 Регистрация: 12.3.2007 Репутация: 3 Всего: 56 |
В любом случае, я считаю метод предложенный PashaPash, единственным разумным из предложенных здесь, т.к. я лично не понял нафига здесь Split, когда нужно подсчитать количество слов. Единственное что требуется уточнить так это понятие слова, если в рамках задачи это понятие не совпадает с понятием слова используемом в регулярных выражениях(\b - граница слова), то правильным решением будет:
-------------------- Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте |
||||
|
|||||
| diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 18 Всего: 142 |
source777, после того, как все в один голос стали писать о том, что проблема решается методом стрингсплит, я обратил внимание на тот факт, что результаты, выдаваемые им будут далеко не всегда корректными, и что в данном случае целесообразно использовать регекспы. Код, приведённый мной в том посте был всего-навсего примером. Далее я упомянул и об использовании Matches(если ты заметил, конечно). Код, предложенный PashaPash - совсем не плох, если не считать того обстоятельства, что единственным, содержащимся в нём новшеством был именно шаблон, о недостатках которого я и написал. А что использовать Split или Matches - это вообще дело вкуса(и конкретных обстоятельств ессно).
Добавлено через 6 минут и 37 секунд И кстати если конкретная задача подразумевает, что слова состоят только из алфавитных символов(без цифр), то можно сделать так
-------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
|||
|
||||
| source777 |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1878 Регистрация: 12.3.2007 Репутация: 3 Всего: 56 |
-------------------- Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте |
||||
|
|||||
| diadiavova |
|
||||||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 18 Всего: 142 |
Берёшься спорить - читай всё
Из моего предыдущего шаблона. Вот, что надо указать Matches
И вот, что сплиту
Что называется "почувствуйте разницу". Кроме того сплит возвращает строковый массив, а иногда нужен именно он. Так что разница не только в том, о чём упомянул ты. -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
||||||
|
|||||||
| Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 8 Всего: 67 |
Да, исходя из постановки задачи решение с Regex.Matches выглядит более правильным
Я изначально предложил string.Split, ибо синтаксиса построения регулярных выражений особо не знаю -------------------- СУВ, Partizan. |
|||
|
||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 9 Всего: 49 |
Чем тебя не устраивает шаблон \b? Это хоть как-то стандартизированная граница слова. В русском дефис - не разбивает слово. В каком нибудь гондурасском - разбивает. Точный способ посчитать количество слов - взять софт с хоть какими нибудь функциями верстки - тот же word, скормить текст ему и подождать. В любом случае взять готовый стандратный символ - лучше, чем составлять таблицу разделителей.
А если не подразумевает? Word считает 42 словом ;). И этот смайлик тоже. |
|||
|
||||
| diadiavova |
|
||||||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 18 Всего: 142 |
Я - тоже(особо). Здесь надо сказать, что во многих случаях использования стрингсплита может оказаться достаточно, в частности, веб-браузеры работают примерно по такой же логике, там от пробелов может зависеть распределение текста. Я, собственно, только указал на возможные ошибки и способ их избежать. Честно говоря мне не очень понятно, почему тема потихоньку начинает превращаться в холивар.
Хотябы тем, что слово, полученное таким образом может включать цифры, но при этом не включает ряд символов, которые так же могут содержаться в словах. К каким последствиям это может привести я показал в примерах. Целое число считается одним словом, а дробное иногда двумя, а иногда тремя итд. Исправить такое положение вещей можно только полной заменой шаблона. (кстати: мой шаблон, приведённый для примера, делит текст по той же логике, что и твой)
Поэтому я и пишу, что предлагать конкретные шаблоны, не зная задачи топикастера, - преждевременно.
Не влюбом. Только в том, который решает задачу корректно. Это был ответ другому участнику, предложившему в шаблоне перечислить алфавитные символы. Я просто указал, что это можно сделать иначе. ЗЫ И кстати: в Гондурасе говорят на испанском -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
||||||
|
|||||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 9 Всего: 49 |
Неизвестная задача - это "любой" случай |
|||
|
||||
| diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 18 Всего: 142 |
То есть, если тебе задача не вполне понятна, то можно дать любой ответ? -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
|||
|
||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 9 Всего: 49 |
diadiavova, нет, просто подходящий в большинстве случаев. И заодно соответствующий хоть какому-то общепринятому стандарту.
|
|||
|
||||
| diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 18 Всего: 142 |
Я, вроде как, привёл список случаев, в которых он возвращает некорректные результаты. ИМХО гораздо правильнее описать с какими "подводными камнями" можно столкнуться при решении этой задачи, чем давать решение, которое может и не подойти.
Я уже не говорю о том, что твой метод с вычислением границ слов и последующим их делением пополам, лично мне кажется слегка экзотическим. Почему было не сделать так \w+? Это сообщение отредактировал(а) diadiavova - 2.6.2009, 13:36 -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
|||
|
||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 9 Всего: 49 |
В каком смысле некорректные? Считает "-" и скобки разделителем? так ты сам это условие ввел По версии ворда вот тут "Это – тоже слово !" - 4 слова. А вот тут - "Это - тоже слово !" - уже 5. Хотя здравый смысл подсказывает что слов тут всего 3. Ворд некорректен? Давай любой алгорим, я тут же дам пример когда он некорректен. А как же внутренняя красота кода? |
|||
|
||||
| Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 8 Всего: 67 |
PashaPash,
diadiavova, ...думаю автор получил ответ на свой вопрос и топик исчерпан... Осталось мне только самому себе предупреждение выписать за провокацию споров string.Split-ом =))) -------------------- СУВ, Partizan. |
|||
|
||||
| diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 18 Всего: 142 |
PashaPash, я, как бы, с самого начала твержу о том, что задача требует уточнения. Именно по тем же причинам.
Красота - понятие субъективное. Partizan, Извини - так вышло Это сообщение отредактировал(а) diadiavova - 2.6.2009, 15:31 -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
|||
|
||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 6 Всего: 118 |
а можно прикрутить спелчекер и "перестраховываться"...
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | .NET для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |