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

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Проверка принадлежности символа диапазону 
:(
    Опции темы
mr.Anderson
  Дата 2.8.2009, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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



Возникла небольшая проблема. У класса System.Char есть метод IsLetterOrDigit(), который, судя по описанию, позволяет проверить, принадлежит ли данный Unicode-символ множеству букв или цифр. Но! У меня есть html-файлик, в котором куча английских и русских букв. И цифр. Этот метод по непонятным причинам отсекает все, кроме английских букв и цифр. Отсюда вопрос, как проверить на русские буквы?

Вот фрагментик чтения:
Код

StreamReader sr = new StreamReader(...);
...
while (sr.EndOfStream == false)
{
    char c = (char) sr.Read();
    if (char.IsLetterOrDigit(c) == false) // если пробел/другой разделитель, что-то делаем
    {
        ...
    }
}

Вопрос, как определить принадлежность символа диапазону русских (именно русских) букв и цифр. Именно русских, потому что мне нужно отсечь все английские слова в документе и выбрать только русские. Если это нельзя сделать методом IsLetterOrDigit (что странно), то можно ли проверить принадлежность символа нужному мне диапазону? В паскале, к примеру, это было возможно сделать так:
Код

var
  C: Char;
...
  if (C in ['A'..'z']) then
    ...


Добавлено через 3 минуты и 17 секунд
И еще. Если мне нужно выделить все русские слова и цифры, то может быть, быстрее посимвольного анализа будет использовать регулярное выражение?

Это сообщение отредактировал(а) mr.Anderson - 2.8.2009, 17:20


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
NightmareZ
Дата 2.8.2009, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


[хакер]
**


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

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



Цитата(mr.Anderson @  2.8.2009,  17:19 Найти цитируемый пост)
Код

if (char.IsLetterOrDigit(с) == false)


В пёрлы!  smile 

Это сообщение отредактировал(а) NightmareZ - 2.8.2009, 18:20


--------------------
NightmareZ.net - мой блог и сайт, мои проекты и прочий трэш
Ely-Art.ru - наша маленькая домашняя арт-студия
mugcraft.ru - кружки на любой вкус
PM WWW ICQ Skype GTalk AOL YIM   Вверх
diadiavova
Дата 2.8.2009, 18:27 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



mr.Anderson, вообще-то функция работает нормально, скорее всего у тебя проблемы из-за кодировки, задай стримридеру ту кодировку, в которой написан документ.

Цитата(mr.Anderson @  2.8.2009,  18:19 Найти цитируемый пост)
Если мне нужно выделить все русские слова и цифры, то может быть, быстрее посимвольного анализа будет использовать регулярное выражение?

Не знаю, что быстрее, но я так и сделал бы smile 
А как в паскале тоже можно сделать, только коллекцию букв придётся создать самому
Код

       string GetCharRange(char startChar, char endChar)
        {
            var cb = new System.Text.StringBuilder();
            for (int i = (int)startChar; i <= (int)endChar; i++)
            {
                cb.Append((char)i);
            }
            return cb.ToString();
        }



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


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

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



mr.Anderson, попробуй:

Код

StreamReader sr = new StreamReader("file", Encoding.GetEncoding(1251));

PM   Вверх
mr.Anderson
Дата 2.8.2009, 18:43 (ссылка)  | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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



Вопрос решен, + THandle.

Добавлено через 2 минуты и 3 секунды
diadiavova, угу, только это можно сделать еще короче. Как-то так:
Код

public List<char> RusLetters = {'а', 'б' ... 'я'};
public bool InRus(char c)
{
    return RusLetters.Contains(c);
}


Добавлено через 3 минуты и 17 секунд
NightmareZ, что-то не нравится? Я не люблю писать
Код
!выражение

Потому что ! не заметен и его можно проворонить при отладке кода. Так нагляднее. Так что нефиг на меня бочку катить... Хендл еще раз спасибо.


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
  
Закрытая темаСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

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


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

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


 




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


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

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