QT正则表达式

规则介绍

元字符 描述
在这里插入图片描述

使用说明

限制浮点数输入范围为[-180,180]:^-?(180|([1-9]?\d|1[0-7][0-9])(.\d)?)$ 或者也可以写成 ^-?(180|([1-9]?[0-9]|1[0-7][0-9])(.[0-9])?)$
限制浮点数输入范围为[-180,180]并限定为小数位后4位:^-?(180|([1-9]?\d|1[0-7][0-9])(.\d{1,4})?)$ 或者也可以写成 ^-?(180|([1-9]?[0-9]|1[0-7][0-9])(.[0-9]{1,4})?)$
1.式子中开头的^和结尾的$限定字符串的开始和结尾;
2.“-?” 表示一个或0个负号,这里面的问号表示其前面的字符重复0次或1次;
3.管道符“|”表示平行分组,表示180或其它形式;
4.[1-9] 表示限定数字范围为1到9,其余类似,如果是有限几个值,还可以用枚举的方式,比如限定-255到255时,第一个数字2的限定,应该表达为[1,2],这表示这个位置只允许是1或者2;
5.“\d"是一个转义字符,表示匹配一位数字(0到9);
6.“.” 表示匹配小数点;
7.”\d+“,这里面的+表示其前面的\d重复一次或多次;
8.”\d{1,4}",里面的{1,4}表示重复1到4次;

有了以上知识,下面我们可以很快的写出限定[-255,255]的正则表达式:
[-255,255]整数:^-?(255|[1-9]?[0-9]|[1,2][0-5][0-4])$
[-255,255]小数:^-?(255|[1-9]?[0-9]|[1,2][0-5][0-4])(.\d)?)$

QT调用示例

QRegExp rx("*.txt");
rx.setPatternSyntax(QRegExp::Wildcard);
rx.exactMatch("README.txt");        // returns true
rx.exactMatch("welcome.txt.bak");   // returns false

QRegExp rx("^\\d\\d?$");    // match integers 0 to 99
rx.indexIn("123");          // returns -1 (no match)
rx.indexIn("-6");           // returns -1 (no match)
rx.indexIn("6");            // returns 0 (matched at position 0)

QRegExp rx("\\b(mail|letter|correspondence)\\b");
rx.indexIn("I sent you an email");     // returns -1 (no match)
rx.indexIn("Please write the letter"); // returns 17

//lineEdit的第一个数是1-9的,第二个数和之后的是0-9的
QRegExp regx("[1-9][0-9]+$");
QValidator *validator = new QRegExpValidator(regx, ui->lineEdit );
lineEdit->setValidator(validator);

QT使用正则表达式限制QLineEdit输入

包含常用的正则表达式
regexp.h

#ifndef REGEXP_H
#define REGEXP_H
#include <QObject>
#include <QValidator>
enum TYPE_REGEXP
{
    TYPE_IP = 0x01,     //IP地址
    TYPE_PHONE,         //手机号11位
    TYPE_MAIL,          //邮箱
    TYPE_DATE,          //日期,2021-12-05
    TYPE_DATE_YM,       //日期,只有年月,2021-12
    TYPE_TIME,          //时间,00:00:00
    TYPE_UINT,          //大于0的正整数
    TYPE_UINT0,         //大于等于0的整数
    TYPE_UINTR,         //0-9数字任意排列
    TYPE_IDCARD,        //身份证号
    TYPE_UFLOAT,        //大于等于0的浮点数
    TYPE_FLOAT,         //有符号浮点数
    TYPE_UINT6,         //6位大于等于0的整数
};
class REGEXP : public QObject
{
    Q_OBJECT
public:
    explicit REGEXP(QObject *parent = nullptr);
    static QValidator *GainValidator(TYPE_REGEXP type);
signals:

public slots:
};

#endif // REGEXP_H

regexp.cpp

#include "regexp.h"

REGEXP::REGEXP(QObject *parent) : QObject(parent)
{

}

QValidator *REGEXP::GainValidator(TYPE_REGEXP type)
{
    QValidator *validator = nullptr;
    QRegExp regx;
    switch(type)
    {
    case TYPE_PHONE:///手机号
        regx.setPattern("[1][3-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]");
        validator = new QRegExpValidator(regx);
        break;
    case TYPE_MAIL:///mail
        regx.setPattern("^[0-9a-zA-Z]+@[0-9a-zA-Z]+(\\.[0-9a-zA-Z]+)+$");
        validator = new QRegExpValidator(regx);
        break;
    case TYPE_IP:///IP
        regx.setPattern("((\\d|([1-9]\\d)|(1\\d{2})|(2[0-4]\\d)|(25[0-5]))\\.){3}(\\d|([1-9]\\d)|(1\\d{2})|(2[0-4]\\d)|(25[0-5]))");
        validator = new QRegExpValidator(regx);
        break;
    case TYPE_DATE:///日期,2021-12-05
        regx.setPattern("(((\\d|\\d{4})-(0\?[13-9]|1[012])-(0\?[1-9]|[12]\\d|30))|((\\d|\\d{2})-(0\?[13578]|1[02])-31)|((\\d|\\d{2})-0\?2-(0\?[1-9]|1\\d|2[0-8]))|(((([13579][26]|[2468][048]|0[48]))|00)-0\?2-29))");
        validator = new QRegExpValidator(regx);
        break;
    case TYPE_DATE_YM:///日期,2021-12
        regx.setPattern("(((\\d|\\d{4})-(0\?[13-9]|1[012])))");
        validator = new QRegExpValidator(regx);
        break;
    case TYPE_TIME:///时间,00:00:00
        regx.setPattern("((1[0-9])|(2[0-3])|(0\?[0-9]))\\:((1[0-9])|(2[0-9])|(3[0-9])|(4[0-9])|(5[0-9])|(0\?[0-9]))\\:((1[0-9])|(2[0-9])|(3[0-9])|(4[0-9])|(5[0-9])|(0\?[0-9]))");//mail
        validator = new QRegExpValidator(regx);
        break;
    case TYPE_UINT:///大于0的正整数
        regx.setPattern("1|[1-9]\\d+$");
        validator = new QRegExpValidator(regx);
        break;
    case TYPE_UINT0:///大于等于0的整数
        regx.setPattern("0|[1-9]\\d+$");
        validator = new QRegExpValidator(regx);
        break;
    case TYPE_UINTR:///9数字任意排列
        regx.setPattern("[0-9]\\d+$");
        validator = new QRegExpValidator(regx);
        break;
    case TYPE_IDCARD:///身份证号
        regx.setPattern("^(\\d{15}$|^\\d{18}$|^\\d{17}(\\d|X|x))$");
        validator = new QRegExpValidator(regx);
        break;
    case TYPE_UFLOAT:///大于等于0的浮点数
        regx.setPattern("^(([0]{1}\\.[0-9]\\d+)|([1-9][0-9]{0,}\\.[0-9]\\d+))$");
        validator = new QRegExpValidator(regx);
        break;
    case TYPE_FLOAT:///有符号浮点数
        regx.setPattern("^(-?[0-9]+)(\\.[0-9]+)?$");
        validator = new QRegExpValidator(regx);
        break;
    case TYPE_UINT6:///6位大于等于0的整数
        regx.setPattern("[0-9][0-9][0-9][0-9][0-9][0-9]");
        validator = new QRegExpValidator(regx);
        break;

    default:
        break;
    }

    return validator;
}

调用示例:

ui->lineEdit_lianxidianhua->setValidator(REGEXP::GainValidator(TYPE_PHONE));

延申:使用正则表达式修复JSON键值没有双引号问题

某些平台返回的JSON数据key或value没有使用""双引号包含,在使用QT解析时无法识别,可使用正则表达式修复JSON数据

#include <regex>
/**
 * @brief 修复JSON数据key没有双引号问题
 * @param jsonString
 * @return 修复后数据
 */
string fixProblemJson_key(const string &jsonString)
{
    std::regex_constants::syntax_option_type fl = std::regex_constants::icase;
    std::regex regReplaceExp("([a-zA-Z0-9]+):", fl);
    return std::regex_replace(jsonString, regReplaceExp, "\"$1\":");
}

/**
 * @brief 修复JSON数据value没有双引号问题
 * @param jsonString
 * @return 修复后数据
 */
string fixProblemJson_Value(const string &jsonString)
{
    std::regex_constants::syntax_option_type fl = std::regex_constants::icase;
    std::regex regReplaceExp("([a-zA-Z0-9]+),", fl);
    return std::regex_replace(jsonString, regReplaceExp, "\"$1\",");
}

///QT调用
QString revMsgStr="{\"certNo\":123456,\"certName\":\"abc\",\"certId\":A,\"validity\":\"1\",\"certTypeCode\":\"01\"}";
QString str = QString::fromUtf8(fixProblemJson_Value(string(revMsgStr.toUtf8())).data());
//打印str="{\"certNo\":\"123456\",\"certName\":\"abc\",\"certId\":\"A\",\"validity\":\"1\",\"certTypeCode\":\"01\"}"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值