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

#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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • memorycleaner汉化版(v4l2 userptr)

    本文链接:https://blog.csdn.net/coroutines/article/details/70141086可参考:http://www.it610.com/article/4522348.htm//v4l2官方翻译基于V4L2的应用,通常面临着大块数据的读取与拷贝等问题。尤其在嵌入式系统中,对于实时性能要求较高的应用,拷贝会花上几十个ms…

    2022年4月16日
    134
  • 二维数组a[3][4]_树状数组的算法原理

    二维数组a[3][4]_树状数组的算法原理原题链接堆栈是一种经典的后进先出的线性结构,相关的操作主要有“入栈”(在堆栈顶插入一个元素)和“出栈”(将栈顶元素返回并从堆栈中删除)。本题要求你实现另一个附加的操作:“取中值”——即返回所有堆栈中元素键值的中值。给定 N 个元素,如果 N 是偶数,则中值定义为第 N/2 小元;若是奇数,则为第 (N+1)/2 小元。输入格式:输入的第一行是正整数 N(≤10​5​​ )。随后 N 行,每行给出一句指令,为以下 3 种之一:Push keyPopPeekMedian其中 key 是不超过

    2022年8月8日
    5
  • Spock单元测试框架使用详解「建议收藏」

    Spock单元测试框架使用详解「建议收藏」Spock(Spock官网:http://spockframework.org/)作为java和Groovy测试一种表达的规范语言,其参考了Junit、Groovy、jMock、Scala等众多语言的优点,并采用Groovy作为其语法,目前能够在绝大多数的集成开发环境(如eclipse,Intellij Ieda),构建工具(如Maven,gradle)等场景运行。Spock单元测试相对于传统的junit、JMockito、EsayMock、Mockito、PowerMock,由于使用了Groovy作为语法

    2022年6月17日
    66
  • aarch64 poky linux,aarch64pokylinuxgcc:错误::没有这样的文件或目录

    aarch64 poky linux,aarch64pokylinuxgcc:错误::没有这样的文件或目录我正在尝试将mlpack包含到我的yocto构建中。如果不启用python绑定,我的配方烘焙成功。但是在构建python绑定时,我得到了以下错误:aarch64-poky-linux-gcc-march=armv8-a-mtune=cortex-a57.cortex-a53–sysroot=/builds/build-h3/tmp/sysroots/h3ulcb-DNDEBUG-g-O…

    2022年8月31日
    3
  • 学生用vs哪个版本_vs2008激活成功教程版

    学生用vs哪个版本_vs2008激活成功教程版以下内容都是转来的,等有时间我会自己整合一下(来源)最近家里的机器重装系统,又得装吃饭的家伙——VS2005了。自从上半年MS出了VS2005的SP1之后,装了几次SP1都觉得挺噩梦的,太长时间了。所以这次参考了网上的一些内容,制作了VS2005的SP1集成版,Professional和TeamSuite各一份。主要还是5步吧,参考了网上的很多资料1把VS…

    2022年9月1日
    6
  • 十天学会php第五天

    十天学会php第五天

    2022年1月11日
    42

发表回复

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

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