大家好,又见面了,我是你们的朋友全栈君。
使用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++正则表达式匹配中文”产生的一系列问题。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/128169.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...