Экранировать строку с помощью RE2::GlobalReplace

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

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

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

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

~/Тест\0\0Папка\0

вместо

~/Тест\\(Папка\)/

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

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


person teoring    schedule 22.03.2019    source источник


Ответы (1)


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

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

person FalcoGer    schedule 22.03.2019
comment
Спасибо за помощь. Работает как шарм. - person teoring; 22.03.2019