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

2022-07-28 09:38:53 浏览数 (1)

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

使用std::wregex

代码语言:javascript复制
#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脚本执行正则匹配:

代码语言:javascript复制
#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):

代码语言:javascript复制
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.cn/128169.html原文链接:https://javaforall.cn

0 人点赞