C++正则匹配中文乱码_中文正则表达式匹配-正则中文匹配

使用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++正则表达式匹配中文”产生的一系列问题。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值