如何在正则中忽略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; }
正则规则解释
^(?!precision\s):负向预查,直接排除以precision开头的默认精度声明行,不会对这类语句做任何修改。(\s*(?:(?!highp|lowp|mediump)\w+\s+)*):- 捕获组,匹配float变量前的所有合法修饰符(如
const、static等) (?!highp|lowp|mediump):负向预查,确保捕获的修饰符中不包含任何精度关键词,避免给已有精度修饰的float重复添加lowp\s*和\s+:处理修饰符前后的空格,保证格式一致性
- 捕获组,匹配float变量前的所有合法修饰符(如
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
相关产品推荐
相关产品推荐

