none
Регулярное выражение RRS feed

  • Вопрос

  • Здравствуйте. Есть часть кода:

     Regex depo1 = new Regex(@"\d+");
    
                do 
                {
                    key = Console.ReadKey(true);
                    if ((key.KeyChar >= '0' && key.KeyChar <= '9') || (key.KeyChar == ',') || key.Key == ConsoleKey.Enter || (key.KeyChar == '.'))
                                                                                                                                                  
                    {   
                        Console.Write(key.KeyChar);
                        s = s + key.KeyChar.ToString(); 
                        if ((key.Key == ConsoleKey.Enter) & (!depo1.IsMatch(s))) 
                        {
                            Console.WriteLine("Неверный формат!");
                        }   
                        

    Почему строка типа "1,,,"(с последующим нажатием клавиши Enter) не заводит выполнение в тело второго оператора if?




    • Изменено Ermak1 4 октября 2015 г. 16:51
    4 октября 2015 г. 16:22

Ответы

  • Вы лучше сформулируйте, чему регулярное выражение должно соответствовать. Например такое выражение: ^\d+$ — соответствует непустой строке, состоящей только из цифр.
    • Помечено в качестве ответа Ermak1 5 октября 2015 г. 8:08
    4 октября 2015 г. 17:25
  • Все просто у вас с встроке подаваемой в регекс лежит три цифры и символ перевода каретки. В 1 вы этот символ перевода каретки добавляете, ну а в 2 вы получаете false.

    • Помечено в качестве ответа Ermak1 5 октября 2015 г. 8:00
    5 октября 2015 г. 7:44
    Отвечающий

Все ответы

  • Выражение new Regex(@"\d+").IsMatch("1,,,") возвращает true, так как строка имеет одну или более цифр, как того требует регулярное выражение. Отсутствие запятых Ваше регулярное выражение не требует.
    4 октября 2015 г. 16:42
  • Выражение new Regex(@"\d+").IsMatch("1,,,") возвращает true, так как строка имеет одну или более цифр, как того требует регулярное выражение. Отсутствие запятых Ваше регулярное выражение не требует.
    Вы правы. Скажите, пожалуйста, почему выражение new Regex(@"\d+[^,]").IsMatch("12,,,,") возвращает true?
    4 октября 2015 г. 16:54
  • 1 — это одна либо более цифр \d+
    2 — это не запятая [^,]

    Регулярное выражение требует, чтобы была хотя бы одна цифра за которой идёт символ, отличный от запятой. Подстрока "12" этому требованию удовлетворяет.

    • Изменено PetSerAl 4 октября 2015 г. 17:05
    4 октября 2015 г. 16:58
  • 1 — одна либо более цифр
    2 — не запятая

    Ну, ладно..."Одна  или более цифр" в строке имеет место быть, но "не запятой" нету :) Там же много запятых.

    Немного переформулирую вопрос: как должно выглядеть выражение, чтоб вернуло false для строки "12,,,,"? Я запутался :)

    4 октября 2015 г. 17:18
  • Вы лучше сформулируйте, чему регулярное выражение должно соответствовать. Например такое выражение: ^\d+$ — соответствует непустой строке, состоящей только из цифр.
    • Помечено в качестве ответа Ermak1 5 октября 2015 г. 8:08
    4 октября 2015 г. 17:25
  • Вы лучше сформулируйте, чему регулярное выражение должно соответствовать. Например такое выражение: ^\d+$ — соответствует непустой строке, состоящей только из цифр.
    Выражение должно соответствовать любому дробному числу.
    4 октября 2015 г. 17:47
  • double.TryParse не вариант?
    4 октября 2015 г. 17:51
  • double.TryParse не вариант?

    Вариант. Но, как я понимаю, строка формата "1,,,,,,,112334,,,52352" в тип double не переведется?(вопрос риторический)

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

    4 октября 2015 г. 18:15
  • Вы лучше сформулируйте, чему регулярное выражение должно соответствовать. Например такое выражение: ^\d+$ — соответствует непустой строке, состоящей только из цифр.

    Выражение должно соответствовать любому дробному числу.

    Кстати, у меня строка типа "123" не соответствует выражению "^\d+$". Не подскажите почему?
    5 октября 2015 г. 5:43
  • Добрый день.

    Да нет, все нормально, соответствует:

    Вы с основной проблемой разобрались? И если нет, то сформулируйте ее еще раз, а то что-то обсуждение от основной темы, мне кажется, ушло...

    5 октября 2015 г. 6:15
    Отвечающий
  • Ну тогда добавьте замену

    Regex regSymbol = new Regex(@"\,{2,}");

    string val = "2,,,,,3,,,4";
    val = regSymbol.Replace(val, ",");

    А потом проверьте на число @"(\d+(\,\d+)?)$"


    Mak Arti

    5 октября 2015 г. 6:58
  • Добрый день.

    Да нет, все нормально, соответствует:

    Вы с основной проблемой разобрались? И если нет, то сформулируйте ее еще раз, а то что-то обсуждение от основной темы, мне кажется, ушло...

    Основная проблема была такая: написать такое выражение, которое возвращало бы false при сопоставлении его со строкой, в которой записано НЕ дробное(десятичная дробь) или НЕ целое число.

    Эту проблему я решил. :)

    А вот, что мне выдает программа при вводе числа "123":

    Да, при соотношении уже готовой переменной типа string("123")  с этим регулярным выражением результат-true. Но, при вводе этого же значения с консоли-false. Что скажете по этому поводу?

    5 октября 2015 г. 7:31
  • Все просто у вас с встроке подаваемой в регекс лежит три цифры и символ перевода каретки. В 1 вы этот символ перевода каретки добавляете, ну а в 2 вы получаете false.

    • Помечено в качестве ответа Ermak1 5 октября 2015 г. 8:00
    5 октября 2015 г. 7:44
    Отвечающий
  • Все просто у вас с встроке подаваемой в регекс лежит три цифры и символ перевода каретки. В 1 вы этот символ перевода каретки добавляете, ну а в 2 вы получаете false.

    Да, Вы правы. Спасибо.
    5 октября 2015 г. 7:50
  • Всем большое спасибо за ответы и советы! Если бы не этот форум, не знаю, что и делал бы. :)
    5 октября 2015 г. 7:52
  • Пожалуйста. Будут вопросы, обращайтесь, постараемся помочь.

    Если какой-то ответ или ответы помогли с решением вашей проблемы, не забудьте их отметить. Для этого под каждым сообщением есть кнопка "Пометить как ответ".

    5 октября 2015 г. 7:55
    Отвечающий
  • Пожалуйста. Будут вопросы, обращайтесь, постараемся помочь.

    Если какой-то ответ или ответы помогли с решением вашей проблемы, не забудьте их отметить. Для этого под каждым сообщением есть кнопка "Пометить как ответ".


    Честно сказать, мне каждый ответ чем-то помог. :) Даже не могу выбрать какой-то один. :) Я из каждого ответа взял для себя что-то. Имеется ввиду не решения, а знания.
    5 октября 2015 г. 7:59
  • Ну так пометьте несколько. Идея в том, чтобы облегчить поиск ответов на форуме. Кто-то попадет в топик и вместо того, чтобы читать все ответы, прочитает один-три ответа которые помечены, как закрывающие проблему. Например, я бы добавил к ответам еще тот, где говориться про ^ и $.
    5 октября 2015 г. 8:04
    Отвечающий
  • Ну так пометьте несколько. Идея в том, чтобы облегчить поиск ответов на форуме. Кто-то попадет в топик и вместо того, чтобы читать все ответы, прочитает один-три ответа которые помечены, как закрывающие проблему. Например, я бы добавил к ответам еще тот, где говориться про ^ и $.
    Не знал, что можно в качестве ответа помечать несколько ответов. :)
    5 октября 2015 г. 8:09
  • А как же дух исследователя? Потыкать во все кнопки и посмотреть что получится? ;)
    5 октября 2015 г. 8:13
    Отвечающий
  • А как же дух исследователя? Потыкать во все кнопки и посмотреть что получится? ;)

    Это само собой! :) Но, знаете, когда "тыканье" затягивается на 2 и более часа...Жалко времени. )
    Я не беру из ответов только решения...Я стараюсь брать бОльшее...
    5 октября 2015 г. 8:17