Escape-строка с использованием RE2 :: GlobalReplace - PullRequest
1 голос
/ 22 марта 2019

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

Я пытаюсь экранировать определенные символы, используя библиотеку RE2.

std::string aInput = "~/Test (Folder)/";
RE2::GlobalReplace( &aInput, "(<|>|\\||\\:|\\(|\\)|&|;|\\s)", "\\\\0" );

Я знаю, что \0 вставляет всю соответствующую группу, но как только я добавляю escape-символ, я получаю неожиданный результат:

~ / Test \ 0 \ 0Folder \ 0

вместо

~ / Test \ \ (Папка \) /

Как вставить \ перед каждой подходящей группой, используя RE2?

PS.RE2 :: QuoteMeta () не вариант для меня, так как он будет экранировать символы, которые мне не нужно экранировать.

1 Ответ

1 голос
/ 22 марта 2019

Группы регулярных выражений начинаются с 1, а не с 0. Кроме того, вы используете "\\\\0" в качестве строки замены. Это буквальный "\0" в вашем последнем регулярном выражении. Заменить "\\\\0" на "\\\\\\1". Это будет иметь значение "\\\1", которое является литералом \ и первой подходящей группой.

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

...