You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在正则中忽略float前的highp/lowp/mediump精度修饰符?

解决Boost正则重复添加lowp精度修饰符的问题

问题分析

你需要为无精度修饰符的float变量添加lowp修饰符,但要避免两种错误场景:

  • 给已经带有highp/lowp/mediump的float重复添加lowp
  • 修改默认精度声明语句(如precision lowp float;)

之前的正则逻辑没有正确排除这两种情况,导致重复添加问题。

解决方案

使用负向预查+捕获组的正则表达式,精准匹配需要添加lowp的场景,同时排除不需要处理的内容。

核心正则表达式

^(?!precision\s)(\s*(?:(?!highp|lowp|mediump)\w+\s+)*)float\b

Boost正则实现代码

#include <boost/regex.hpp>
#include <string>
#include <iostream>

std::string add_lowp_to_float(const std::string& input) {
    // 使用Perl风格正则,兼容Boost的断言语法
    boost::regex re(R"(^(?!precision\s)(\s*(?:(?!highp|lowp|mediump)\w+\s+)*)float\b)", boost::regex::perl);
    // 替换规则:在捕获的修饰符前插入lowp
    return boost::regex_replace(input, re, "lowp $1float", boost::regex_constants::match_default | boost::regex_constants::format_sed);
}

int main() {
    // 测试用例
    std::string cases[] = {
        "const float x;",
        "lowp const float x;",
        "precision lowp float;",
        "static volatile float y;",
        "float z;"
    };

    for (const auto& s : cases) {
        std::cout << "输入:" << s << "\n输出:" << add_lowp_to_float(s) << "\n" << std::endl;
    }
    return 0;
}

正则规则解释

  1. ^(?!precision\s):负向预查,直接排除以precision 开头的默认精度声明行,不会对这类语句做任何修改。
  2. (\s*(?:(?!highp|lowp|mediump)\w+\s+)*):
    • 捕获组,匹配float变量前的所有合法修饰符(如const、static等)
    • (?!highp|lowp|mediump):负向预查,确保捕获的修饰符中不包含任何精度关键词,避免给已有精度修饰的float重复添加lowp
    • \s*和\s+:处理修饰符前后的空格,保证格式一致性
  3. float\b:匹配独立的float单词(\b是单词边界,避免误匹配floats这类衍生词)

测试结果

运行代码后会输出:

输入:const float x;
输出:lowp const float x;

输入:lowp const float x;
输出:lowp const float x;

输入:precision lowp float;
输出:precision lowp float;

输入:static volatile float y;
输出:lowp static volatile float y;

输入:float z;
输出:lowp float z;

内容的提问来源于stack exchange,提问作者Fox1942

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 06:47:07