如何使用QRegExp验证电子邮件地址

5

我需要验证qlineedit中输入的文本是否符合正则表达式的格式,我尝试使用以下代码:

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());

但是它没有起作用。

提前致谢。


2
可能是重复的问题:如何使用正则表达式验证电子邮件地址? - johnsyweb
2个回答

12
为什么你将模式语法设置为“通配符(wildcard)”?假设您理解了正则表达式本身被简化了,您的代码可以使用 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");

打印出true


我改成了正则表达式,但仍然收到了指示数据错误的消息。 - Vordok

9
如果你想创建一个真正的QValidator,以便在例如QLineEdits中重复使用,你还需要检查中间的电子邮件地址字符串,否则除非你将电子邮件地址复制粘贴到编辑中,否则不会被接受。
以下是一个EmailValidator的示例:
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

还有emailvalidator.cpp文件:

#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();
}

仅为完整起见,我该如何使用这段代码? - Mr. Developerdude
就我而言,我已经不知道是我自己写的还是在其他地方看到的了。但我认为第一个是对的,所以请随意使用它。 - nerdoc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接