CMake: как получить литерал обратной косой черты в Regexp заменить?

Я пытаюсь заменить forwardslhes на обратную косую черту. Для этого у меня есть следующая строка кода:

STRING(REGEX REPLACE "/" "\\" SourceGroup ${SourceGroupPath} )

SourceGroupPath = A/Файл/Путь. SourceGroup - это переменная, чтобы установить результат.

Проблема, с которой я столкнулась, связана с частью "\\" с кодом. Я пробовал несколько способов использовать обратный знак, похожий на "\\", и используя unicode, но ничего не работает.

Ошибка, которую я получаю в CMake:

Ошибка CMake в CMakeLists.txt: 41 (STRING): строковая подкоманда REGEX, режим ЗАМЕНИТЬ: Заменить выражение в обратном слэше.

Кто-нибудь может помочь мне?

Спасибо,

Wouter

Ответ 1

Причина в том, что в литерал-строке CMake обратная косая черта - это escape-символ (как в C, Java или JavaScript), так и в regex, обратная косая черта также является escape-символом.

Итак, чтобы представить регулярное выражение как строковый литерал, вам нужно выполнить двойное экранирование. (Вот почему многие языки "высшего уровня" имеют буквенное обозначение регулярного выражения, BTW.)

Строковый литерал "\\" представляет строку in-memory "\" и что недопустимое регулярное выражение, поэтому ошибка "заканчивается в обратном слэше".

Строковый литерал "\\\\" представляет "\\" в памяти, который является допустимым регулярным выражением (представляющим одну обратную косую черту).

Ответ 2

Это более простой способ сделать это

file(TO_NATIVE_PATH ${MYPATH} MYPATH)