Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Использование только определённых символов


Автор: N1ko 15.6.2009, 22:41
Если у меня строка содержит символы русского английского алфавита и цифры, делать то то... Если нет, вызвать message box с сообщением и ввести символы заново. Как это реализовать попроще в c#?

Или прийдётся ввести в масив все нужные мне символы и буквы, а потом сверять их наличие в нужной мне строке?

Автор: Grok 16.6.2009, 00:53
что-то вроде этого:

Код

      if (Regex.IsMatch(strInput, "\\w"))
      {

      }
      else
      {
          MessageBox.Show("text");
      }


только если strInput будет считываться с файла, то для конструктора StreamReader нужно будет указать соответсвенную кодировку, чтобы нормально работало с кирилицей, например:
Код

using (StreamReader st = new StreamReader("text.txt", Encoding.GetEncoding(1251)))
{
      string strInput = st.ReadToEnd();
}

Автор: N1ko 19.6.2009, 01:45
Пробую использовать regex, но ничего не получается.  Я хочу проверить строку на наличие исключительно цифр или букв. То есть если в строке будут символы типо запятой. точек и тп, строка буде не верной. А у меня сейчас програма проверяет строку на наличие указаных мной символов, но ей пофиг есть ли там пунктуационные знаки и тп. Как это записать? Через оператор ^ будет глуповато перечислять все ненужные мне символы.

Автор: diadiavova 19.6.2009, 06:51
Цифры обозначаются так \d, буквы так [\w-[\d]]

Автор: N1ko 19.6.2009, 12:26
Так тоже пробовал. Но если в строку попадает какой нибуть пунктуационный знак и в тоже время в ней есть буквы и цифры, програма считает строку правильной... А мне надо что бы она ругалась, когда в строку попадают символы не относящиеся к алфавиту или пунктуационные знаки.

Автор: diadiavova 19.6.2009, 13:56
Для символов, не относящихся к алфавиту есть спецсимвол \W. Точнее сказать это НЕ \w, а учитывая, что последний кроме алфавитных символов включает ещё и цифры, то неалфавит будет таким [\W\d]. И проверять надо при помощи функции IsMatch
Код

if(Regex.IsMatch(sample, @"[\W\d]") 
Messagebox.Show("Текст содержит недопустимые символы");


Автор: N1ko 19.6.2009, 14:32
Хорошо... Допустим я ввожу строку "qwerty;.,1" в текстовое поле. В данной строке  присутствуют как символы алфавита, пунктуационные знаки так и цифры.  Попробовал твой вариант, но программа пропускает этот случай и считает его правильным.(Хотя алфавит вроде бы и запрещён) Поскольку в строке есть всего лишь один разрешённый символ(цифра).

Автор: diadiavova 19.6.2009, 14:36
Я не правильно написал, тут надо не проверять на соответствие, а проверять их количество
Код

if(Regex.Matches(sample, @"[\W\d]").Count>0) 
Messagebox.Show("Текст содержит недопустимые символы");

бывает smile 

Автор: Grok 20.6.2009, 00:45
N1ko, в коде что писал diadiavova
Код

if(Regex.IsMatch(sample, @"[\W\d]") 
Messagebox.Show("Текст содержит недопустимые символы");

данный предикат есть true, если в строке встречается неалфавитный символ или цифра, 
соответственно в сроке "qwerty;.,1" их есть целых 4(";.,1"), при наличии хотя бы одного из них строка правильная,
и если ты хочешь исключить в строке эти символы, тоесть строка была бы корректной, если они не встречаются, то соответствено 
Код

if(!Regex.IsMatch(sample, @"[\W\d]") 
Messagebox.Show("Текст валиден");

Автор: N1ko 12.9.2009, 13:46
Пишу вот такую строку
 
Код

if (!Regex.IsMatch(textBox_NewStorage.Text, @"[\W][\S]"))
{
MessageBox.Show("Valid");
}

подразумевая под ней что моя строка может содержать буквы, цифры и знак пробела. НО не может содержать другие знаки:точки запятые и тп. Потом например ввожу следующую строку "sdf sdfg" Сообщение на окно не вылазит. Что я делаю не так. Уже всё перерыл в поисках ответа.

Автор: diadiavova 12.9.2009, 13:52
Код

if (Regex.IsMatch(textBox_NewStorage.Text, @"[а-яА-Яa-zA-Z\d]+"))
{
     MessageBox.Show("Valid");
}

Автор: N1ko 12.9.2009, 18:13
Попробовал твой ваиант Допустим ввожу строку "ffggr;;;ewqq", оно её принимает как правильную хотя поскольку здесь присутствуют точки с запятой, теоретически такого быть не должно

Автор: diadiavova 12.9.2009, 18:31
Код

            if (Regex.IsMatch(textBox_NewStorage.Text, @"^[а-яА-Яa-zA-Z\d]+$", RegexOptions.Singleline))
            {
                MessageBox.Show("Valid");
            }
            else
            {
                MessageBox.Show("Inalid");
            
            }

Автор: N1ko 12.9.2009, 23:03
А что значит ^ и +$ в данном случае? Читал инфу по поводу этих знаков, но всё равно не очень понятно зачем они здесь

Автор: diadiavova 12.9.2009, 23:08
Цитата(N1ko @  13.9.2009,  00:03 Найти цитируемый пост)
А что значит ^ и +$ в данном случае? 

Начало и конец проверяемой строки. Без них берётся только часть строки и выдаётся ответ, что типа соответствует, а та часть, где точки с запятой не учитывается. Эти значки показывают, что соответствие должно быть подтверждено ели только вся строка соответствует шаблону. Но их значение при однострочном и многострочном форматах немного отличается, но всё в документации есть.

Добавлено через 7 минут и 46 секунд
А да, только сейчас заметил. Плюсик показывает, что символ может встречаться один или более раз. Без него шаблон соответствует одному символу.

Автор: Экскалупатор 12.9.2009, 23:57
а что если по коду символов проверять? т.е. если символ попадает в заданный диапазон то все ок. а если нет то ставим счетчику +1, и потом проверяем счетчик?
сильно не кричите, мне просто интересно, будет ли это нормальным или лучше все таки через regex?

Автор: diadiavova 13.9.2009, 00:28
Экскалупатор, Тогда придётся проверять несколько диапазонов для  каждого символа и если задача слегка изменится код может сильно усложнится. Регулярные выражения сильно упрощают весь процесс: небольшой шаблон и простейший код обработки, в случае изменения задачи немного подправить шаблон и всё.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)