CMake: как получить замену литерала обратной косой черты в Regexp? - PullRequest
12 голосов
/ 20 декабря 2010

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

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

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

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

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

Ошибка CMake на CMakeLists.txt: 41 (STRING): строка подкоманды REGEX, режим REPLACE: замена выражения заканчивается в обратном слеше.

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

Спасибо

Wouter

Ответы [ 2 ]

22 голосов
/ 20 декабря 2010

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

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

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

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

10 голосов
/ 15 ноября 2013

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

file(TO_NATIVE_PATH ${MYPATH} MYPATH)
...