Qt中QRegExp对象的一个可以利用的bug

项目场景:

使用Qt中的正则表达式对象QRegExp和QRegularExpression中一个bug的利用方法


问题描述:

Qt中旧版的QRegExp对象在Qt 5.x版本中已经由QRegularExpression对象替代,而且因为QRegExp对象维护不足而有一些奇怪的bug,示例代码如下:

#include <QCoreApplication>
#include <QDebug>
#include <QRegExp>
#include <QRegularExpression>

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);

    QRegExp re0("[\\x4e00-\\x9fa5\\s]");
    QRegularExpression re1("[\\x4e00-\\x9fa5\\s]");

    QString string("This is a 中文 sentance");
    for (auto item : string.split(re0).toVector()) {
        if (item.length() != 0) {
            qDebug() << item << endl;
        }
    }

    for (auto item : string.split(re1).toVector()) {
        if (item.length() != 0) {
            qDebug() << item << endl;
        }
    }

    return 0;
}

预计的输出是:
This
is
a
santence
This
is
a
santence
而实际的输出是:
This
is
a
santence
中文


原因分析:

这里尝试看源代码,但是Qt中找不到这部分的实现代码,只提供了函数的原型,因此无法进行原因分析。


解决方案:

这个bug不用解决。使用的时候可以将同一个字符串使用两种正则表达式作为参数,使用QString.split()方法,QRegExp对象只会保存英文单词,QRegularExpression只会保存中文单词,因此可以用这个bug将文本中的中英文单词分开。
注:这样做在文件比较小的时候可以正常使用,在文本长度过大的时候因为调用两次split方法而会造成性能浪费。

更新: 2021-01-20

这里识别中英文是依靠十六进制码进行判断的,如果使用[\u4e00-\u9fa5]作为正则表达式那么这种方法就会失效。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OriginCoding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值