Russian Qt Forum

Qt => Вопросы новичков => Тема начата: smilik от Март 04, 2015, 19:37



Название: проверка строчки на соответствие шаблона
Отправлено: smilik от Март 04, 2015, 19:37
Добрый день!!!Есть строка и вот мне нужно проверить содержит ли она только цифры и точки.


Название: Re: проверка строчки на соответствие шаблона
Отправлено: Igors от Март 04, 2015, 19:53
Ну щас начнется вакханалия с регуляркой  :'(


Название: Re: проверка строчки на соответствие шаблона
Отправлено: gil9red от Март 04, 2015, 20:28
Через регулярку проверить есть ли символы, который не цифры и не точка
Через цикл перебрать каждый символ строки и сравнивать вручную


Название: Re: проверка строчки на соответствие шаблона
Отправлено: smilik от Март 04, 2015, 21:07
спасибо, а без цикла никак да??


Название: Re: проверка строчки на соответствие шаблона
Отправлено: Hrundel от Март 04, 2015, 21:31
Если это просто в QLineEdit вводится, то можно избавиться от всей свистопляски с регулярами и предопределить маску ввода.
Но если поле должно хавать любой ввод, то без регулярки не обойтись.


Название: Re: проверка строчки на соответствие шаблона
Отправлено: gil9red от Март 04, 2015, 23:58
спасибо, а без цикла никак да??

А что в нем такого страшного? :)


Название: Re: проверка строчки на соответствие шаблона
Отправлено: Fregloin от Март 05, 2015, 10:07
регулярные выражения в любом случае используют внутри себя циклы, так что без них никак.


Название: Re: проверка строчки на соответствие шаблона
Отправлено: __Heaven__ от Март 05, 2015, 10:11
Строка - это массив. А обработка массивов в 99% случаев производится с помощью циклов. Так что не надо стесняться :)


Название: Re: проверка строчки на соответствие шаблона
Отправлено: deMax от Март 05, 2015, 11:01
Если это просто в QLineEdit вводится, то можно избавиться от всей свистопляски с регулярами и предопределить маску ввода.
Но если поле должно хавать любой ввод, то без регулярки не обойтись.
Для QLineEdit регулярка самое то, подсвечивать красным когда не по шаблону и блокировать кнопку "ОК".
спасибо, а без цикла никак да??
Как вы это себе представляете?
Можете цикл через лямда функцию сделать, чтобы вид был "красивый" (на любителя).


Название: Re: проверка строчки на соответствие шаблона
Отправлено: Alexu007 от Март 05, 2015, 15:49
спасибо, а без цикла никак да??
Чё ж никак? Можно и без цикла:

Код
C++ (Qt)
if(str[0] != ...)
if(str[1] != ...)
if(str[2] != ...)
if(str[3] != ...)
if(str[4] != ...)

и так далее до 256... шутка.


Код
C++ (Qt)
float x;
bool ok;
x = str.toFloat(&ok);

при ошибке возвращает х = 0.0, ok = false


Название: Re: проверка строчки на соответствие шаблона
Отправлено: deMax от Март 05, 2015, 16:29
Код
C++ (Qt)
if(str[0] != ...)
if(str[1] != ...)
if(str[2] != ...)
if(str[3] != ...)
if(str[4] != ...)
и так далее до 256... шутка.
На ассемблере иногда так делали, в далекие времена для циклов с точным числом проходов. Когда по производительности совсем плохо было.
В тяжелые циклы теоретически такое можно засунуть.

Код
C++ (Qt)
float x;
bool ok;
x = str.toFloat(&ok);
при ошибке возвращает х = 0.0, ok = false
Если у него число пусть QSpinBox использует, если ip адрес то регулярка. Не надо издеваться над пользователем.


Тут есть неплохой пример такого компонента http://qt-project.org/forums/viewthread/24785


Название: Re: проверка строчки на соответствие шаблона
Отправлено: Igors от Март 05, 2015, 17:20
Код
C++ (Qt)
if(str[0] != ...)
if(str[1] != ...)
if(str[2] != ...)
if(str[3] != ...)
if(str[4] != ...)
и так далее до 256... шутка.
На ассемблере иногда так делали, в далекие времена для циклов с точным числом проходов. Когда по производительности совсем плохо было.
А так и сейчас делают - только компиляторы, и цель другая

спасибо, а без цикла никак да??
Ну прям как-то "с придыханием" :) А там есть удобный isDigit
Код
C++ (Qt)
inline bool IsDigitAndPointsOnly( const QString & s, bool emptyOk = true )
{
if (!s.size()) return emtyOk;
for (int i = 0; i < s.size(); ++i)
 if (!s[i].isDigit() && s[i] != '.') return false;
 
return true;
}


Название: Re: проверка строчки на соответствие шаблона
Отправлено: kambala от Март 05, 2015, 21:37
Ну щас начнется вакханалия с регуляркой  :'(
абсолютно нормальное решение для современного времени. настоящая вакханалия начнется в велосипеде, когда надо будет проверить входную строку на "в начале то-то, дальше что-то, а заканчивается на такое".


Название: Re: проверка строчки на соответствие шаблона
Отправлено: PinkPanther от Март 05, 2015, 21:52
QRegExp exp("^[\\d\\.]*$"); - если строка может быть пустой, или
QRegExp exp("^[\\d\\.]+$"); - если должна содержать хоть один символ.

Сама проверка exp.exactMatch(str);


Название: Re: проверка строчки на соответствие шаблона
Отправлено: kambala от Март 05, 2015, 22:12
точку можно не экранировать в [] ;)


Название: Re: проверка строчки на соответствие шаблона
Отправлено: PinkPanther от Март 05, 2015, 22:32
точку можно не экранировать в [] ;)

Точно. Можно сократить длину паттерна на 1-2 байта. ;)


Название: Re: проверка строчки на соответствие шаблона
Отправлено: Igors от Март 06, 2015, 10:29
абсолютно нормальное решение для современного времени. настоящая вакханалия начнется в велосипеде ..
Не надо обижать велосипедистов, они создали все на чем пасутся другие :) Упражнения со строками - прекрасная тренировка логического мЫшления, когда ее (упорно) избегают - это выглядит подозрительно, он что, не может решить простую задачку? Словом, сомнительная "ориентация"  :)


Название: Re: проверка строчки на соответствие шаблона
Отправлено: kambala от Март 06, 2015, 13:12
наверняка избегают потому, что думают, что есть готовое решение :)