Russian Qt Forum
Сентябрь 30, 2024, 20:29 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: проверка строчки на соответствие шаблона  (Прочитано 8562 раз)
smilik
Гость
« : Март 04, 2015, 19:37 »

Добрый день!!!Есть строка и вот мне нужно проверить содержит ли она только цифры и точки.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Март 04, 2015, 19:53 »

Ну щас начнется вакханалия с регуляркой  Плачущий
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #2 : Март 04, 2015, 20:28 »

Через регулярку проверить есть ли символы, который не цифры и не точка
Через цикл перебрать каждый символ строки и сравнивать вручную
Записан

smilik
Гость
« Ответ #3 : Март 04, 2015, 21:07 »

спасибо, а без цикла никак да??
Записан
Hrundel
Гость
« Ответ #4 : Март 04, 2015, 21:31 »

Если это просто в QLineEdit вводится, то можно избавиться от всей свистопляски с регулярами и предопределить маску ввода.
Но если поле должно хавать любой ввод, то без регулярки не обойтись.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #5 : Март 04, 2015, 23:58 »

спасибо, а без цикла никак да??

А что в нем такого страшного? Улыбающийся
Записан

Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #6 : Март 05, 2015, 10:07 »

регулярные выражения в любом случае используют внутри себя циклы, так что без них никак.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #7 : Март 05, 2015, 10:11 »

Строка - это массив. А обработка массивов в 99% случаев производится с помощью циклов. Так что не надо стесняться Улыбающийся
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #8 : Март 05, 2015, 11:01 »

Если это просто в QLineEdit вводится, то можно избавиться от всей свистопляски с регулярами и предопределить маску ввода.
Но если поле должно хавать любой ввод, то без регулярки не обойтись.
Для QLineEdit регулярка самое то, подсвечивать красным когда не по шаблону и блокировать кнопку "ОК".
спасибо, а без цикла никак да??
Как вы это себе представляете?
Можете цикл через лямда функцию сделать, чтобы вид был "красивый" (на любителя).
Записан
Alexu007
Гость
« Ответ #9 : Март 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
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #10 : Март 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
« Последнее редактирование: Март 05, 2015, 16:38 от deMax » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Март 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;
}
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #12 : Март 05, 2015, 21:37 »

Ну щас начнется вакханалия с регуляркой  Плачущий
абсолютно нормальное решение для современного времени. настоящая вакханалия начнется в велосипеде, когда надо будет проверить входную строку на "в начале то-то, дальше что-то, а заканчивается на такое".
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
PinkPanther
Самовар
**
Offline Offline

Сообщений: 169



Просмотр профиля
« Ответ #13 : Март 05, 2015, 21:52 »

QRegExp exp("^[\\d\\.]*$"); - если строка может быть пустой, или
QRegExp exp("^[\\d\\.]+$"); - если должна содержать хоть один символ.

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

Эвтаназия - наше хобби!
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #14 : Март 05, 2015, 22:12 »

точку можно не экранировать в [] Подмигивающий
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.151 секунд. Запросов: 23.