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

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

  • 前言
  • 正则表达式
    • QT 中的使用
        • QRegExp自带的cap方法怎么用?
        • QRegExp的非贪婪模式与贪婪模式
    • 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个圆括弧中的值。

以如下代码进行测试:

    //Teststatic 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。

QString cap(int nth = 0);
QRegExp的非贪婪模式与贪婪模式

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

    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}}";

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

    //Teststatic 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 中的正则表达式语法如下:

/正则表达式主体/修饰符(可选)

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

QT 跑JS 语言

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

实例demo 如下:

    //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方法进行双引号字符串的删除,可以很好实现。

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;}))");

直接返回json 的value,归根到底还是对js语言的不熟悉呀,要继续补基础。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/708045.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iOS App冷启动优化:二进制重排

原理 二进制文件中方法的加载顺序&#xff0c; 取决于方法在代码文件中的书写顺序&#xff0c;而不是调用顺序。 应用程序启动时会调用到的方法是有限的&#xff0c;但可能分散在很多个。 由于内存是分页管理的&#xff0c;要加载就要 整页加载。 这就导致很多完全还用不到的方…

网站添加pwa操作和配置manifest.json后,没有效果排查问题

pwa技术官网&#xff1a;https://web.dev/learn/pwa 应用清单manifest.json文件字段说明&#xff1a;https://web.dev/articles/add-manifest?hlzh-cn Web App Manifest&#xff1a;Web App Manifest | MDN 当网站添加了manifest.json文件后&#xff0c;也引入到html中了&a…

FPGA-FIF0模型与应用场景(IP核)

什么是FIFO FIFO (First In First Out) ,也就是先进先出。FPGA或者ASIC中使用到的FIFO一般指的是对数据的存储具有先进先出特性的一个缓存器,常被用于数据的缓存或者高速异步数据的交互。它与普通存储器的区别是没有外部读写地址线,这样使用起来相对简单,但缺点就是只能顺序写…

python脚本实现全景站点欧拉角转矩阵

效果 脚本 import numpy as np import math import csv import os from settings import *def euler_to_rotation_matrix(roll, pitch, yaw):# 计算旋转矩阵# Z-Y-X转换顺序Rz

java多线程编程(学习笔记)入门

一、多线程创建的三种方式 (1)通过继承Thread本身 (2)通过实现runnable接口 (3)通过 Callable 和 Future 创建线程 其中&#xff0c;前两种不能获取到编程的结果&#xff0c;第三种能获取到结果 二、常见的成员方法 方法名称说明String getName()返回此线程的名称void setNam…

Docker之数据卷自定义镜像

文章目录 前言一、数据卷二、自定义镜像 前言 Docker提供了一个持久化存储数据的机制&#xff0c;与容器生命周期分离&#xff0c;从而带来一系列好处&#xff1a; 总的来说Docker 数据卷提供了一种灵活、持久、可共享的存储机制&#xff0c;使得容器化应用在数据管理方面更加…

Git 指令深入浅出【3】—— 远程仓库

Git 指令深入浅出【3】—— 远程仓库 一、远程仓库&#xff08;一&#xff09;基本指令1. 配置 SSH 密钥2. 推送远程仓库其他分支推送远程仓库方法1方法2建立分支链接 方法3 3. 合并分支请求 &#xff08;二&#xff09;.gitignore 忽略文件&#xff08;三&#xff09;标签管理…

MVCC【重点】

参考链接 [1] https://www.bilibili.com/video/BV1YD4y1J7Qq/?spm_id_from333.1007.top_right_bar_window_history.content.click&vd_source0cb0c5881f5c7d76e7580fbd2f551074 [2]https://www.cnblogs.com/jelly12345/p/14889331.html [3]https://xiaolincoding.com/mysql…

基于频率增强的数据增广的视觉语言导航方法(VLN论文阅读)

基于频率增强的数据增广的视觉语言导航方法&#xff08;VLN论文阅读&#xff09; 本文提出的方法很简单&#xff0c;将原始图像增加其他随机图像的高频信息&#xff0c;得到增强的图像作为新的样本&#xff0c;与原始的样本交替训练。背后的动机是&#xff0c;vln模型对高频信息…

TV-SAM 新型零样本医学图像分割算法:GPT-4语言处理 + GLIP视觉理解 + SAM分割技术

TV-SAM 新型零样本医学图像分割算法&#xff1a;GPT-4语言处理 GLIP视觉理解 SAM分割技术 提出背景TV-SAM 方法论 提出背景 论文&#xff1a;https://arxiv.org/ftp/arxiv/papers/2402/2402.15759.pdf 代码&#xff1a;https://github.com/JZK00/TV-SAM 利用了GPT-4的强大语…

TCP/IP-常用网络协议自定义结构体

1、TCP/IP模型&#xff1a; 2、TCP/IP- 各层级网络协议&#xff08;从下往上&#xff09;&#xff1a; 1&#xff09;数据链路层&#xff1a; ARP: 地址解析协议&#xff0c;用IP地址获取MAC地址的协议&#xff0c;通过ip的地址获取mac地 …

【最新】如何将idea上的项目推送到gitee

1.打开Gitee&#xff0c;在首页&#xff0c;点击“”&#xff0c;创建一个仓库 2.填写仓库基本信息 3.下拉&#xff0c;点击“创建”&#xff0c;出现下方页面&#xff0c;证明仓库创建成功。 4.打开idea&#xff0c;下载gitee的插件&#xff08;此处默认已经下载git&#xff0…

基于React, Redux实现的俄罗斯方块游戏及源码

分享一个俄罗斯方块游戏游戏框架使用的是 React Redux&#xff0c;其中再加入了 Immutable&#xff0c;用它的实例来做来Redux的state。&#xff08;有关React和Redux的介绍可以看 安装 npm install运行 npm start浏览自动打开 http://127.0.0.1:8080/ 打包编译 npm run …

T - SQL使用事务 及 在Winform使用事务

事务适用场景 1 事务使用在存储过程中&#xff0c;直接在数据库中进行编写 2 事务使用在Winfrom项目中 SQl&#xff1a;使用事务转账操作的实例 一般都会找一个变量记录错误的个数&#xff0c;error记录上一句sql的错误和错误编号 declare errornum int 0 -- 定义…

selenium-激活pycharm,以及在pycharm中使用selenium时标红报错问题处理

激活pycharm&#xff1a;http://idea.955code.com/ 01 pycharm中导入selenium报错 现象: pycharm中输入from selenium import webdriver, selenium标红 原因1: pycharm使用的虚拟环境中没有安装selenium&#xff1a; 解决方法: 在pycharm中通过设置或terminal面板重新安装s…

nosql的注入

一、SQL注入数据库分类 关系型数据库 mysql oracle sqlserver 非关系型数据库 key-value redis MongoDB&#xff08;not only sql&#xff09; 二、MongoDB环境搭建 自己官网下载 Download MongoDB Community Server | MongoDB 其中Mongod.exe是它的一个启动 加上数据库&…

本届挑战赛亚军方案:面向微服务架构系统中无标注、多模态运维数据的异常检测、根因定位与可解释性分析

CheerX团队来自于南瑞研究院系统平台研发中心&#xff0c;中心主要从事NUSP电力自动化通用软件平台的关键技术研究与软件研发。 选题分析 图1 研究现状 本次CheerX团队的选题紧密贴合了目前的运维现状。实际运维中存在多种问题导致运维系统的不可用。比如故障发生时&#xff…

[设计模式Java实现附plantuml源码~行为型] 对象状态及其转换——状态模式

前言&#xff1a; 为什么之前写过Golang 版的设计模式&#xff0c;还在重新写Java 版&#xff1f; 答&#xff1a;因为对于我而言&#xff0c;当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言&#xff0c;更适合用于学习设计模式。 为什么类图要附上uml 因为很…

基于JAVAEE+Eclipse+Tomcat+Mysql开发的的停车场管理系统

基于JAVAEEEclipseTomcatMysql开发的的停车场管理系统 项目介绍&#x1f481;&#x1f3fb; 如今&#xff0c;我国现代化发展迅速&#xff0c;人口比例急剧上升&#xff0c;在一些大型的商场&#xff0c;显得就格外拥挤&#xff0c;私家车的数量越来越多&#xff0c;商场停车难…

【深度学习】Pytorch 教程(十四):PyTorch数据结构:6、数据集(Dataset)与数据加载器(DataLoader):自定义鸢尾花数据类

文章目录 一、前言二、实验环境三、PyTorch数据结构1、Tensor&#xff08;张量&#xff09;1. 维度&#xff08;Dimensions&#xff09;2. 数据类型&#xff08;Data Types&#xff09;3. GPU加速&#xff08;GPU Acceleration&#xff09; 2、张量的数学运算1. 向量运算2. 矩阵…