C++ 如何使用qregexp验证电子邮件地址
我需要验证在qlineedit中输入的文本是否具有regexp的形式,我尝试使用以下方法:C++ 如何使用qregexp验证电子邮件地址,c++,qt,C++,Qt,我需要验证在qlineedit中输入的文本是否具有regexp的形式,我尝试使用以下方法: void MainWindow::checkReg( QLineEdit& mail, const QCheckBox& skip, string type ) { if(type == "mail") { if( skip.checkState() != 2) { QRegExp mailREX("\\b[A-Z0-
void MainWindow::checkReg( QLineEdit& mail, const QCheckBox& skip, string type )
{
if(type == "mail")
{
if( skip.checkState() != 2)
{
QRegExp mailREX("\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}\\b");
mailREX.setCaseSensitivity(Qt::CaseInsensitive);
mailREX.setPatternSyntax(QRegExp::Wildcard);
bool regMat = mailREX.exactMatch(mail.text());
if(regMat == false)
{
QMessageBox *message = new QMessageBox(this);
message->setWindowModality(Qt::NonModal);
message->setText("Inserte los datos en el formato correcto");
message->setStandardButtons(QMessageBox::Ok);
message->setWindowTitle("MainWindow");
message->setIcon(QMessageBox::Information);
message->exec();
this->ok = 0;
mail.clear();
}
else
this->ok = 1;
}
}
}
但我输入的每封邮件都像me@me.com,将显示错误消息。我也试过使用
int regMat = mailREX.indexIn(mail.text());
但它不起作用
提前感谢为什么将模式语法设置为通配符?您的代码使用
regexp
模式语法工作(假设您理解,您的regexp本身是简化的):
QRegExp mailREX("\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}\\b");
mailREX.setCaseSensitivity(Qt::CaseInsensitive);
mailREX.setPatternSyntax(QRegExp::RegExp);
qDebug() << mailREX.exactMatch("me@me.com");
QRegExp mailREX(\\b[A-Z0-9.\%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\\b”);
setCaseSensitivity(Qt::CaseSensitivity);
setPatternSyntax(QRegExp::RegExp);
qDebug()如果您想创建一个真正的QValidator以在QLineEdits中重用,您还必须检查中间电子邮件地址字符串,否则将不接受任何内容,除非您将电子邮件地址复制并粘贴到编辑中
以下是电子邮件验证程序的示例:
emailvalidator.h文件:
#ifndef EMAILVALIDATOR_H
#define EMAILVALIDATOR_H
#include <QValidator>
QT_BEGIN_NAMESPACE
class QRegExp;
QT_END_NAMESPACE
class EmailValidator : public QValidator
{
Q_OBJECT
public:
explicit EmailValidator(QObject *parent = 0);
State validate(QString &text, int &pos) const;
void fixup(QString &text) const;
private:
const QRegExp m_validMailRegExp;
const QRegExp m_intermediateMailRegExp;
};
#endif // EMAILVALIDATOR_H
可能重复我更改为RegExp,但它仍然向我发送消息,表明数据是错误的只是为了完整性,我将如何使用此代码?就我而言,我不知道是否是我自己编写的或在其他地方看到的。但我认为第一个-所以请随意使用它。
#include "emailvalidator.h"
EmailValidator::EmailValidator(QObject *parent) :
QValidator(parent),
m_validMailRegExp("[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,4}"),
m_intermediateMailRegExp("[a-z0-9._%+-]*@?[a-z0-9.-]*\\.?[a-z]*")
{
}
QValidator::State EmailValidator::validate(QString &text, int &pos) const
{
Q_UNUSED(pos)
fixup(text);
if (m_validMailRegExp.exactMatch(text))
return Acceptable;
if (m_intermediateMailRegExp.exactMatch(text))
return Intermediate;
return Invalid;
}
void EmailValidator::fixup(QString &text) const
{
text = text.trimmed().toLower();
}