crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> QRegExp, QRegExpvalidator, регулярные выражения..
Andrewshkovskii
  опции профиля:
сообщение 5.4.2009, 18:40
Сообщение #1


Активный участник
***

Группа: Участник
Сообщений: 351
Регистрация: 27.12.2008
Пользователь №: 467

Спасибо сказали: 18 раз(а)




Репутация:   1  


Пишу вот форму регистрации, есть следующий код :

функция проверки

QString RegisterForm::validateAll()
{
    QString passwordval   ("/^(?=.*\d)(?=.*([a-z]|[A-Z]))([\x20-\x7E]){8,12}$/");
    QString mailval       ("/^([a-zA-Z0-9_\.\-\+])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/");
    QString usernameval   ("^[A-Za-z0-9]$");
    QString lastAndFirstNameval  ("/[а-яА-Я\s\-]/");
    int pos =0;
    regexp->setPattern(lastAndFirstNameval);
    if((validator->validate(FName,pos))==0) || (validator->validate(FName,pos)) == 1 );
     return "Invalid first name";
   if((validator->validate(LName,pos))==0 )|| (validator->validate(LName,pos)) == 1 );
     return "Invalid last name";
    regexp->setPattern(usernameval);
    if((validator->validate(Nickname,pos))==QValidator::Invalid) || (validator->validate(Nickname,pos)) == 1 );
     return "Invalid username";
    regexp->setPattern(mailval);
    if((validator->validate(EMail,pos))==0) || (validator->validate(EMail,pos)) == 1 );
     return "Invalid e-mail adress";
    regexp->setPattern(passwordval);
    if((validator->validate(Password,pos))==0) || (validator->validate(Password,pos)) == 1 );
     return "Invalid password";
    if(Password!=ConfirmPassword)
         return "Confirm password != password";
                 else return "all validated";
}


Эта функция вызывается в слоте, по нажатию кнопочки OK, все данные(QString'ги FName и т.д) получаю из QLineEdit'ов.

Валидатор создается так :
 regexp = new QRegExp;
validator = new QRegExpValidator(*regexp,0);


Проблема - при любом раскладе будет возвращать Invalid first name и далее(last name, username..) почему?Рег-экспы не правильно написал?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 5.4.2009, 18:52
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Andrewshkovskii @ 5.4.2009, 22:40) *
"/[а-яА-Я\s\-]/"
Зачем слэши ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrewshkovskii
  опции профиля:
сообщение 5.4.2009, 19:00
Сообщение #3


Активный участник
***

Группа: Участник
Сообщений: 351
Регистрация: 27.12.2008
Пользователь №: 467

Спасибо сказали: 18 раз(а)




Репутация:   1  


Ну я брал примеры регэкспов, проще говоря готовые, просто времени нету щас разбираться в них.
Убрал я слэши..без разницы, возвращает сразу Invalid first name.
Даже есть поставить шаблон на проверку имени : "[A-C]\\d{5}[W-Z]" (из примера в асисте), то A12345Z - не проходит.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 5.4.2009, 19:06
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Andrewshkovskii @ 5.4.2009, 23:00) *
A12345Z - не проходит
а каково правило, словесное?

если все буквы и цифры, то так:
[a-zA-Z0-9]+

П.С. если проблема в регулярном выражении, то предлагаю отдельную темку создать "Помогите написать регулярное выражение"

Т.к. проблема всплывала неоднократно, но размазана по форуму, просто так не найдешь. Следовательно в одном месте всякие объяснения/подсказки были бы к стати.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrewshkovskii
  опции профиля:
сообщение 5.4.2009, 19:11
Сообщение #5


Активный участник
***

Группа: Участник
Сообщений: 351
Регистрация: 27.12.2008
Пользователь №: 467

Спасибо сказали: 18 раз(а)




Репутация:   1  


Черт, да все равно возвращает "Invalid first name".Проверяю я эту функцию вот как :
void RegisterForm::goRegister()
{
validateMessage = new QMessageBox(this);
  validateMessage->setIcon(QMessageBox::Warning);
if (validateAll()!="all validated")
        validateMessage->setText(validateAll());
        validateMessage->exec();
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 5.4.2009, 19:13
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


ты регулярку сначала проверь (%QTDIR%\examples\tools\regexp)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrewshkovskii
  опции профиля:
сообщение 5.4.2009, 19:25
Сообщение #7


Активный участник
***

Группа: Участник
Сообщений: 351
Регистрация: 27.12.2008
Пользователь №: 467

Спасибо сказали: 18 раз(а)




Репутация:   1  


Эм..этот пример..Он показывает, валидна ли моя строка заданному регэкспу?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
molchanoviv
  опции профиля:
сообщение 5.4.2009, 20:11
Сообщение #8


Старейший участник
****

Группа: Сомодератор
Сообщений: 597
Регистрация: 18.7.2008
Из: Саратов
Пользователь №: 238

Спасибо сказали: 41 раз(а)




Репутация:   5  


проверяй правильность своих регекспов с помощью этой программы. Очень помогает.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 5.4.2009, 21:28
Сообщение #9


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Andrewshkovskii @ 5.4.2009, 23:25) *
Эм..этот пример..Он показывает, валидна ли моя строка заданному регэкспу?
совершенно верно, я её в своё время модифицировал, для жирных кусков проверок тут (SVN: http://svn.assembla.com/svn/ysoft/regexp)

molchanoviv, тыб ссылочку на страницу проекта дал, а то сразу загрузка.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrewshkovskii
  опции профиля:
сообщение 5.4.2009, 23:11
Сообщение #10


Активный участник
***

Группа: Участник
Сообщений: 351
Регистрация: 27.12.2008
Пользователь №: 467

Спасибо сказали: 18 раз(а)




Репутация:   1  


Спасибо за программу, внушительна:)
Только..всеравно не работает. Может ошибки именно в логике?вот исходники..
registerform.h

#ifndef REGISTERFORM_H
#define REGISTERFORM_H

#include <QPushButton>
#include <QFormLayout>
#include <QLabel>
#include <QString>
#include <QLineEdit>
#include <QDialog>
#include <QRegExp>
#include <QMessageBox>
#include <QRegExpValidator>

class RegisterForm : public QDialog
{

    Q_OBJECT

public:
    RegisterForm(QWidget *parent=0);
    QString FName;
    QString LName;
    QString Nickname;
    QString EMail;
    QString Password;
    QString ConfirmPassword;

private:
    QFormLayout *layout;
    QLabel *fName;
    QLabel *lName;
    QLabel  *nickname;
    QLabel *eMail;
    QLabel *password;
    QLabel *confirmPassword;
    QLineEdit *fNameEdit;
    QLineEdit *lNameEdit;
    QLineEdit *nicknameEdit;
    QLineEdit *eMailEdit;
    QLineEdit *passwordEdit;
    QLineEdit *confirmPasswordEdit;
    QPushButton *ok;
    QPushButton *cancel;
    QRegExp *regexp;
    QRegExpValidator *validator;
    void createWidgets();
    void configureWidgets();
    void setLayouts();
    void setConnections();
    QString validateAll();
    QMessageBox *validateMessage;

private slots:
  void getText();
  void clearEdit();
  void goRegister();
};

#endif // REGISTERFORM_H



registerform.cpp

#include "registerform.h"

RegisterForm::RegisterForm(QWidget *parent):QDialog(parent)
{
    this->createWidgets();
    this->configureWidgets();
    this->setConnections();
    this->setLayouts();
}

void RegisterForm::createWidgets()
{
fName = new QLabel;
lName = new QLabel;
nickname = new QLabel;
password = new QLabel;
confirmPassword = new QLabel;
eMail = new QLabel;
fNameEdit = new QLineEdit;
lNameEdit = new QLineEdit;
nicknameEdit = new QLineEdit;
passwordEdit = new QLineEdit;
confirmPasswordEdit = new QLineEdit;
eMailEdit = new QLineEdit;
ok = new QPushButton;
cancel = new QPushButton;
layout = new QFormLayout;
regexp = new QRegExp;
validator = new QRegExpValidator(*regexp,0);
validateMessage = new QMessageBox(this);
}

void RegisterForm::configureWidgets()
{
fName->setText("Имя");
lName->setText("Фамилия");
nickname->setText("Имя пользователя");
password->setText("Пароль");
confirmPassword->setText("Подтвердите пароль");
eMail->setText("E-Mail");
ok->setText("Ok");
cancel->setText("Отмена");
passwordEdit->setEchoMode(QLineEdit::Password);
confirmPasswordEdit->setEchoMode(QLineEdit::Password);
fNameEdit->setMaxLength(15);
lNameEdit->setMaxLength(15);
nicknameEdit->setMaxLength(15);
passwordEdit->setMaxLength(12);
confirmPasswordEdit->setMaxLength(12);
this->setWindowTitle("Регистрация нового пользователя");
this->setWindowModality(Qt::ApplicationModal);
validateMessage->setIcon(QMessageBox::Warning);
validateMessage->setText("Введенные вами данные не поддерживаются системой.\n"
                          "Для Фамилии и Имени используйте только кириллицу(А-Я),(а-я).\n"
                          "Для имени пользователя используйте только латинские\n"
                          "буквы (a-z), цифры (0-9).\n"
                          "В качестве символов пароля могут быть использованны\n"
                          "любые символы.\n"
                          "В качестве E-Mail адреса используйте шаблон типа :\n"
                          "username@servername.domainname, где domainname : ru,com и т.д.");
}

void RegisterForm::setLayouts()
{
layout->addRow(fName,fNameEdit);
layout->addRow(lName,lNameEdit);
layout->addRow(nickname,nicknameEdit);
layout->addRow(password,passwordEdit);
layout->addRow(confirmPassword,confirmPasswordEdit);
layout->addRow(eMail,eMailEdit);
layout->addRow(ok,cancel);
this->setLayout(layout);
}

void RegisterForm::setConnections()
{
connect(ok,SIGNAL(clicked()),this,SLOT(getText()));
connect (ok,SIGNAL(clicked()),this,SLOT(goRegister()));
connect(cancel,SIGNAL(clicked()),this,SLOT(close()));
connect(cancel,SIGNAL(clicked()),this,SLOT(clearEdit()));
}

void RegisterForm::getText()
{
FName = fNameEdit->text();
LName = lNameEdit->text();
Nickname =nicknameEdit->text();
Password = passwordEdit->text();
ConfirmPassword= confirmPasswordEdit->text();
EMail= eMailEdit->text();
}

QString RegisterForm::validateAll()
{
    QString passwordval   ("(?!^[0-9]*$)(?!^[a-zA-Z]*$)^([a-zA-Z0-9]{6,15})$");
    QString mailval       ("^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$");
    QString usernameval   ("[a-zA-Z0-9]+");
    QString lastAndFirstNameval  ("[а-zА-я-ZЯ]+");
    int pos =0;
    regexp->setPattern(lastAndFirstNameval);
    if((validator->validate(FName,pos))==QValidator::Invalid)// || (validator->validate(FName,pos)) == 1 );
     return "Invalid first name";
   if((validator->validate(LName,pos))==QValidator::Invalid )//|| (validator->validate(LName,pos)) == 1 );
     return "Invalid last name";
    regexp->setPattern(usernameval);
    if((validator->validate(Nickname,pos))==QValidator::Invalid)// || (validator->validate(Nickname,pos)) == 1 );
     return "Invalid username";
    regexp->setPattern(mailval);
    if((validator->validate(EMail,pos))==QValidator::Invalid)// || (validator->validate(EMail,pos)) == 1 );
     return "Invalid e-mail adress";
    regexp->setPattern(passwordval);
    if((validator->validate(Password,pos))==QValidator::Invalid)// || (validator->validate(Password,pos)) == 1 );
     return "Invalid password";
    if(Password!=ConfirmPassword)
         return "Confirm password != password";
                 else return "all validated";
}

void RegisterForm::clearEdit()
{
  fNameEdit->clear();
  lNameEdit->clear();
  nicknameEdit->clear();
  passwordEdit->clear();
  confirmPasswordEdit->clear();
  eMailEdit->clear();
}

void RegisterForm::goRegister()
{
    if (validateAll()!="all validated"){
        validateMessage->setText(validateAll());
        validateMessage->exec();}
}



Сообщение отредактировал Andrewshkovskii - 5.4.2009, 23:34
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 1.12.2024, 14:13