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

Я создаю небольшую функцию, которая способна изменять две строки ниже.

 precision highp float; 
 highp float intensity;

на это:

 precision highp float; 
 lowp float intensity;

Поэтому практически я не хочу изменять модификатор точности по умолчанию. Я также хотел бы принять во внимание, что если между точностью и высоким значением есть пробелы, например:

 precision /*more white spaces*/ highp float;

Я хотел написать \s+ за пределами регулярного выражения.

  ((?<!\bprecision\s+)(highp\s+float))

но, насколько я знаю, Boost Negative Look Beyond не поддерживает это, и поэтому он выдает мне ошибку во время выполнения.

Каким может быть решение?


2
50
1

Ответ:

Решено

Вы можете использовать

\bprecision\s+highp\s+float(*SKIP)(?!)|highp\s+float

Посмотрите демонстрацию регулярных выражений .

Идея состоит в том, чтобы сопоставить нежелательную часть строки, пропустить ее и только затем сопоставить то, что вам нужно в других контекстах.

Подробности

  • \bprecision\s+highp\s+float(*SKIP)(?!) — соответствует, а затем пропускает следующее:
    • \b - граница слова
    • precision\s+highp\s+float - precision highp float с любым количеством пробелов между словами
    • (*SKIP)(?!) - исключить совпадение из буфера памяти совпадений и начать поиск совпадения с конечной позиции неудачи
  • | - или
  • highp\s+float - highp + один или несколько пробелов + float.

Также узнайте больше о (*SKIP) и поддержке других глаголов PCRE в Boost.

Обратите внимание, что (*FAIL) = (?!).

Вы также можете найти \bprecision\s+highp\s+float(*SKIP)(?!)|highp(?=\s+float) и заменить его просто lowp.

Добавьте границы слов, где это необходимо.