Как игнорировать ключевые слова в регулярном выражении перед переменными?

Я пытаюсь создать функцию, которая способна

  • размещение ключевых слов модулятора точности перед переменными с плавающей запятой, где такого ключевого слова нет

Итак, он преобразует

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
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я предлагаю использовать

\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 в шаблоне замены обозначает все значение совпадения.

Спасибо или ваш ответ! Он работает нормально! Кстати, есть ли какой-нибудь облегченный вариант библиотеки Boost regex lib, предназначенный только для заголовков?

Fox1942 22.08.2024 16:08

@ Fox1942 Нет, возможно, вы думаете о чем-то простом, например regex.h, но поверьте мне, это слишком маломощно.

Wiktor Stribiżew 22.08.2024 16:23

Другие вопросы по теме