【QT+JS】QT和JS 中的正则表达式 、QT跑JS语言

【QT+JS】QT和JS 中的正则表达式 、QT跑JS语言


前言

在看大佬的系统代码时候,对其中灵活用到的正则表达式QT 跑JS 语言部分感觉很陌生,之前也不太常用,其中正则表达式虽然平时也有在用,但更多的是零零碎碎的,没有进行系统的整理。因此,花时间对这几个部分进行了专门的学习,写demo 进行了测试,并进行了测试,方便后续的翻阅。

正则表达式

QT 中的使用

在QT 中用QRegExp进行正则表达式的编写,需要注意的是,C ++编译器将反斜杠转换为字符串。要将\包含在正则表达式中,请输入两次,即\。要匹配反斜杠字符本身,请输入四次,即\\。

在大佬的博文Qt正则表达式类QRegExp(附检验小程序)已经有了很好的正则表达式整理,在这里我不进行重复介绍,只对使用过程中遇到的问题进行记录。

QRegExp自带的cap方法怎么用?

QRegExp 的cap(int n) 方法表示第n个组的内容(0代表匹配自身)。

  • cap()参数缺省值为0。
  • cap(0):表示匹配的整个文本的值。
  • cap(1):表示第1个圆括弧中的值。
  • cap(2):表示第2个圆括弧中的值。

以如下代码进行测试:

cpp 复制代码
    //Test
    static QRegExp rx("\\{\\{(\\S+)\\}\\}");
//    rx.setMinimal(true);//非贪婪模式,即就近搜寻
    QString sql="INSERT INTO ecs_pod2(rtucode,podcode,date) VALUES (''{{body.rtucode}}'',"
                  "''{{back.pod}}'',{{db.datetype}}) ON conflict(rtucode) "
                  "DO UPDATE SET podcode=excluded.podcode,date={{db.datetype}}";
    while (sql.indexOf(rx)>=0){
        qDebug()<<"----------------"<<rx.cap(0)<<"---------3-------"<<rx.cap(1)<<"----------------";
        sql.replace(rx.cap(0),"df");
    }
    qDebug() << sql;
  • "\\{\\{(\\S+)\\}\\}" 根据正则表达式查找,表示{``{匹配多个非空白字符}}

输出结果如下:

可以很清楚的看出cap(0):表示匹配的整个文本的值。cap(1):表示第1个圆括弧中的值。 表示的意思。同时,定位cap 函数定义如下,当未赋予初始值时,默认0。

cpp 复制代码
QString cap(int nth = 0);
QRegExp的非贪婪模式与贪婪模式

在上节测试中,不难发现,最后打印输出的SQL 并不符合我们的需求,我们需要实现就近搜寻,考虑到正则表达式为匹配非空白字符,因此可以对SQL 语句进行更改,在每个所需条件后面增加空格。

cpp 复制代码
    QString sql="INSERT INTO ecs_pod2(rtucode,podcode,date) VALUES (''{{body.rtucode}}''空格,"
                  "''{{back.pod}}''空格,{{db.datetype}}) ON conflict(rtucode) "
                  "DO UPDATE SET podcode=excluded.podcode,date={{db.datetype}}";

这样打印输出的结果符合要求,但是在实际应用过程中,太束缚,很明显就是正则表达式有问题。那我们要修改正则表达式?刚开始确实有这个考虑,后来发现并不是。我们只需要设置正则表达式为非贪婪模式 就可以,即就近搜寻

cpp 复制代码
    //Test
    static QRegExp rx("\\{\\{(\\S+)\\}\\}");
    rx.setMinimal(true);//非贪婪模式,即就近搜寻
    QString sql="INSERT INTO ecs_pod2(rtucode,podcode,date) VALUES (''{{body.rtucode}}'',"
                  "''{{back.pod}}'',{{db.datetype}}) ON conflict(rtucode) "
                  "DO UPDATE SET podcode=excluded.podcode,date={{db.datetype}}";
    while (sql.indexOf(rx)>=0){
        qDebug()<<"----------------"<<rx.cap(0)<<"---------3-------"<<rx.cap(1)<<"----------------";
        sql.replace(rx.cap(0),"df");
    }
    qDebug() << sql;

在增加了rx.setMinimal(true);后,在进行输出,结果如下:

很完美,符合我们的需求。

JS 中的使用

JS 中的正则表达式语法如下:

cpp 复制代码
/正则表达式主体/修饰符(可选)

这部分整理在菜鸟教程JavaScript 正则表达式中有完整的介绍和使用测试,在查询时候可以直接查阅。

QT 跑JS 语言

在QT 中跑JS 语言也是可以的,这时候我们不得不提到QJSEngine ,在QT的官方说明文件中,对其的使用有着明确解释。首先需要在pro 文件中写QT += qml进行库的导入,其次#include <QJSEngine>就可以开始类的使用。详细内容可以查看官方说明文件,这里不进行重复说明,只对遇到的问题进行记录。

实例demo 如下:

cpp 复制代码
    //
    QJsonObject obj;
    obj.insert("rtucode", "ZC34");
    QByteArray body=QJsonDocument(obj).toJson(QJsonDocument::Compact);

    const static QString js("((function(b){var body=JSON.parse(b);return JSON.stringify(body.rtucode);}))");
//    const static QString js("((function(b){var body=JSON.parse(b);return JSON.stringify(body.rtucode).replace(/[\"]/g, '');}))");
//    const static QString js("((function(b){var body=JSON.parse(b);return body.rtucode;}))");
    QJSEngine myEngine;
    QJSValue fun = myEngine.evaluate(js);
//     qDebug()<< fun.toString() <<"---";
    const QJSValueList args={QString(body)};
    QJSValue d = fun.call(args);
    qDebug()<< d.toString() <<"---";

最后的输出为:

这不符合我们的要i去,我们只需要ZC34 字符串,最初采用了replace 方法进行双引号字符串的删除,可以很好实现。

cpp 复制代码
const static QString js("((function(b){var body=JSON.parse(b);return JSON.stringify(body.rtucode).replace(/[\"]/g, '');}))");

但是采用该种方法具有一定的局限性,最后在大佬的指导下,问题完美解决。

cpp 复制代码
const static QString js("((function(b){var body=JSON.parse(b);return body.rtucode;}))");

直接返回json 的value ,归根到底还是对js语言的不熟悉呀,要继续补基础。

相关推荐
神之王楠12 分钟前
如何通过js加载css和html
javascript·css·html
余生H16 分钟前
前端的全栈混合之路Meteor篇:关于前后端分离及与各框架的对比
前端·javascript·node.js·全栈
MinBadGuy35 分钟前
【GeekBand】C++设计模式笔记5_Observer_观察者模式
c++·设计模式
流烟默35 分钟前
Vue中watch监听属性的一些应用总结
前端·javascript·vue.js·watch
茶卡盐佑星_1 小时前
meta标签作用/SEO优化
前端·javascript·html
与衫1 小时前
掌握嵌套子查询:复杂 SQL 中 * 列的准确表列关系
android·javascript·sql
金灰1 小时前
HTML5--裸体回顾
java·开发语言·前端·javascript·html·html5
Promise5201 小时前
总结汇总小工具
前端·javascript
Манго нектар2 小时前
JavaScript for循环语句
开发语言·前端·javascript
Zheng1133 小时前
【可视化大屏】将柱状图引入到html页面中
javascript·ajax·html