Я пытаюсь создать функцию, которая способна
Итак, он преобразует
const float x;
к
lowp const float x;
Однако я хотел бы игнорировать следующие сценарии:
lowp const float x;
precision lowp float;
Судя по моему предыдущему вопросу ссылка, это мое регулярное выражение:
(\bhighp((?:\s+\w+)*)(float|(?:i|b)?vec[2-4]|mat[2-4](?:x[2-4])?)(*SKIP)(?!)|\bfloat\b)
Поэтому я бы просто хотел игнорировать те случаи, когда перед плаванием находится highp|lowp|medium.
У меня есть эта команда регулярного выражения:
#include <iostream>
#include <string>
#include <boost/regex/v5/regex.hpp>
using namespace boost;
std::string precisionModulation(std::string& shaderSource) {
const regex highpFloatRegex2(R"(highp|lowp|mediump((?:\s+\w+)*)(float)(*SKIP)(?!)|(?=\s+(float)))");
shaderSource = regex_replace(shaderSource, highpFloatRegex2, "lowp");
return shaderSource;
}
int main() {
std::string shaderSource = R"(
float foo1;
highp const float foo1;
precision highp float foo2;
)";
std::cout << "Original Shader Source:\n" << shaderSource << std::endl;
std::string modifiedSource = precisionModulation(shaderSource);
std::cout << "\nModified Shader Source:\n" << modifiedSource << std::endl;
return 0;
}
К сожалению, я получил странные результаты:
Original Shader Source:
float foo1;
highp const float foo1;
const highp float foo1;
precision highp float foo2;
Modified Shader Source:
lowp float foo1;
highp const lowp float foo1;
const highp lowp float foo1;
precision highp lowp float foo2;
Я также попробовал:
\w*(?<!highp)((?:\s+\w+)*)\s+float
Я предлагаю использовать
\bhighp(?:\s+\w+)*\s+(?:float|[ib]?vec[2-4]|mat[2-4](?:x[2-4])?)(*SKIP)(?!)|\b(?:const\s+)?float\b
Посмотрите демонстрацию регулярных выражений .
Подробности:
\bhighp(?:\s+\w+)*\s+(?:float|[ib]?vec[2-4]|mat[2-4](?:x[2-4])?)(*SKIP)(?!)
— соответствует и пропускает следующее:
\b
- граница словаhighp
- слово highp
(?:\s+\w+)*
— ноль или более вхождений одного или нескольких пробелов, за которыми следует один или несколько символов слова.\s+
— один или несколько пробелов (в исходном шаблоне этот шаблон отсутствует, и он не позволяет чему-либо сопоставиться)(?:float|[ib]?vec[2-4]|mat[2-4](?:x[2-4])?)
- float
, или ivec
/bvec
/vec
, за которым следует 2
, 3
или 4
, или mat
, за которым следует 2
, 3
или 4
, а затем необязательный x
, за которым следуют 2
, 3
или 4
|
- или\b(?:const\s+)?float\b
— целое слово float
, которому может предшествовать const
и один или несколько пробелов.В вашем коде это должно выглядеть так
const regex highpFloatRegex2(R"(\bhighp(?:\s+\w+)*\s+(?:float|[ib]?vec[2-4]|mat[2-4](?:x[2-4])?)(*SKIP)(?!)|\b(?:const\s+)?float\b)");
shaderSource = regex_replace(shaderSource, highpFloatRegex2, "lowp $0");
Обратите внимание, что $0
в шаблоне замены обозначает все значение совпадения.
@ Fox1942 Нет, возможно, вы думаете о чем-то простом, например regex.h
, но поверьте мне, это слишком маломощно.
Спасибо или ваш ответ! Он работает нормально! Кстати, есть ли какой-нибудь облегченный вариант библиотеки Boost regex lib, предназначенный только для заголовков?