Я пишу программу cpp, которая является лексическим анализатором для языка, подобного cpp. Чтобы найти каждый токен, я использую регулярное выражение, а затем решаю выбрать правильный токен.
Строки на этом языке в точности похожи на cpp. Регулярное выражение, которое я использую, выглядит следующим образом:
\"([^\\\"]|\\.)?\"
Но это не совсем правильно. Для ввода, как это:
"String \" int"
Выходные данные должны быть одним строковым токеном, но с моим регулярным выражением я получаю один строковый токен («String») и ключевое слово int, а затем ошибку.
У вас есть идеи, как с этим справиться? Или как я должен изменить регулярное выражение?
Постскриптум : Я использую regex_search (), чтобы найти совпадение.
Спасибо.
Вы можете использовать
std::regex rx(R"(\"[^\"\\]*(?:\\.[^\"\\]*)*\")");
Шаблон "[^"\\]*(?:\\.[^"\\]*)*"
:
"
— двойная цитата[^"\\]*
— ноль или более символов, кроме двойной кавычки и обратной косой черты(?:\\.[^"\\]*)*
— ноль или более повторений
\\.
— любой символ с обратной косой чертой (заменить .
с [\s\S]
если вам нужно также поддерживать экранированные разрывы строк)[^"\\]*
— ноль или более символов, кроме двойной кавычки и обратной косой черты"
двойная кавычка.Увидеть regex demo.
Других решений пока нет …