正则表达式判断字符有乱码(正则文法转正则表达式)

#include<QtCore/QCoreApplication>#include<iostream>#include<string>#include<regex>usingnamespacestd;intmain(intargc,char*argv[]){ QCoreApplicationa(argc,argv); boolfoundmatch=false; try{ std::wregexre(L

大家好,又见面了,我是你们的朋友全栈君。

使用std::wregex

#include <QtCore/QCoreApplication>
#include <iostream>
#include <string>
#include <regex>

using namespace std;

int main(int argc, char *argv[])
{ 
   
	QCoreApplication a(argc, argv);
	bool foundmatch = false;
	try { 
   
		std::wregex re(LR"([a-zA-Z]:\\[\.\w-_\u4e00-\u9fa5\\]*)"); //windows文件夹路径
		std::wstring subject = L"D:\\Tools\\软件\\xournalpp-1.0.17-windows";
		foundmatch = std::regex_search(subject, re);
		cout << foundmatch << endl;
	}
	catch (std::regex_error& e) { 
   
		cout << e.what() << endl;
	}
	return a.exec();
}

以上方式存在缺陷,不支持Unicode scrpt。(\p{IsScript} for Unicode scripts)
在这里插入图片描述

使用qt框架下的QJSEngine类:

在c++中运行js脚本执行正则匹配:

#include <QtCore/QCoreApplication>
#include <QJSEngine>
#include <QDebug>
#include <QFile>
#include <QTextStream>

using namespace std;

int main(int argc, char *argv[])
{ 
   
	QCoreApplication a(argc, argv);
	QJSEngine js;
	QJSValue module = js.importModule("D:/tcl_me/math.mjs");
	QJSValue sumFunction = module.property("sum");
	QString str = "38u48djhfod中国,@##@!_)+bia發財";
	QJSValueList args;
	args << str;
	QJSValue result = sumFunction.call(args);
	if (result.isError())
	{ 
   
		qDebug() << result.toString();
		return -1;
	}
	qDebug() << result.toBool();
	return a.exec();
}

使用的js脚本代码(math.mjs):

export function sum(subject) { 
   
	var reg = /[\p{Han}]+/g;
    var ret = subject.match(reg);
    return ret;
}

运行结果:
在这里插入图片描述
匹配成功。

期间测试过PCRE、PCRE2,Boost::regex,POCO::RegularExpression、Googel::RE2效果均不佳,根本原因是c++语言本身对Unicode的支持欠佳,需要使用ICU通用组件库配合Boost::regex,并且Boost::regex默认ICU不参加编译,十分麻烦。
QJSEngine搭载V8引擎,执行js脚本相当快。故采用c++和js脚本混合编程快速解决“c++正则表达式匹配中文”产生的一系列问题。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/128169.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 注会综合记忆锦囊:手绘PEST模型,记忆可以这样玩「建议收藏」

    注会综合记忆锦囊:手绘PEST模型,记忆可以这样玩「建议收藏」【】综合的记忆量非常庞大,且看小萌有妙招,通过“关键词”和“手绘图”带你一起巧记忆。一、PEST宏观环境分析:4项1.政治因素:4项(1)执政党所持的态度和推行的基本政策(2)企业所在国家和地区的政局稳定状况(3)政府行为对企业的影响(4)各政治利益集团对企业活动产生的影响2.法律环境因素:4项(1)国家司法机关和执法机关(2)国际法所规定的国际法律环境和目标国

    2022年5月23日
    34
  • 用c语言实现二叉树层序遍历

    用c语言实现二叉树层序遍历#include&lt;stdio.h&gt;#include&lt;stdlib.h&gt;#defineN8typedefstructnode{ intdata; structnode*left,*right;}BTNode;BTNode*CreateTree(inta[]){ inti; BTNode*p,*c,*pa,*root; root=(BTNode*)mal…

    2022年5月11日
    46
  • Java Eclipse下载安装教程[通俗易懂]

    Java Eclipse下载安装教程[通俗易懂]一、下载:(1)Eclipse是一个开放源代码的项目,其官方网站是www.eclipse.org(2)从首页中单击DOWNLOAD按钮,进入图2所示的页面。(3)点击DownloadPackages,进入Eclipse下载页面。从EclipseIDEforJavaEEDevelopers后面选择适合当前系统的版本,这里单击64bit按钮,…

    2022年5月2日
    34
  • 系统调用(int 0x80)详解

    系统调用(int 0x80)详解1、系统调用初始化在系统启动时,会在sched_init(void)函数中调用set_system_gate(0x80,&system_call),设置中断向量号0x80的中断描述符:#defineset_system_gate(n,addr) _set_gate(&idt[n],15,3,addr)其中15表示此中断号对应的是陷阱门,注意,这个中断向量不是中断门描述符

    2022年9月13日
    0
  • 内连接、左外连接与右外连接的区别及作用介绍

    内连接、左外连接与右外连接的区别及作用介绍SQL语句当中比较难的部分就有今天要给朋友们分享的这个,innerjoin,leftjoin和rightjoin他们三个的作用以及区别是什么。顺便也会把交叉连接一起分享了。上面会分享一些基本的语法与使用,下方会详细介绍1)交叉连接,又称笛卡尔积SELECT*FROMtb1CROSSJOINtb2;//简写SELECT*FROMtb1,tb2;2)内连接//语法SELECTsome_columnsFROMtable1INNERJOINta

    2022年10月21日
    1
  • PyCharm与Python的安装教程2021.11

    PyCharm与Python的安装教程2021.11文章预览:一、进入官网下载PyCharm安装包二、等待下载完成后点击进行安装三、Python安装(只介绍最新版本)四、第一个PyCharm程序五、PyCharm安装第三方库方法一、进入官网下载PyCharm安装包自行进入PyCharm官网或点击https://www.jetbrains.com/pycharm/download/#section=windows下载的是社区版,免费并且足够使用。二、等待下载完成后点击进行安装1.点击next2.选择自己要安装的目录3.勾选一些设定(1

    2022年8月28日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号