Как выразить cpp-подобную строку с помощью регулярных выражений (лексический анализ)

Я пишу программу cpp, которая является лексическим анализатором для языка, подобного cpp. Чтобы найти каждый токен, я использую регулярное выражение, а затем решаю выбрать правильный токен.

Строки на этом языке в точности похожи на cpp. Регулярное выражение, которое я использую, выглядит следующим образом:

\"([^\\\"]|\\.)?\"

Но это не совсем правильно. Для ввода, как это:

"String \" int"

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

У вас есть идеи, как с этим справиться? Или как я должен изменить регулярное выражение?

Постскриптум : Я использую regex_search (), чтобы найти совпадение.

Спасибо.

1

Решение

Вы можете использовать

std::regex rx(R"(\"[^\"\\]*(?:\\.[^\"\\]*)*\")");

Шаблон "[^"\\]*(?:\\.[^"\\]*)*":

  • " — двойная цитата
  • [^"\\]* — ноль или более символов, кроме двойной кавычки и обратной косой черты
  • (?:\\.[^"\\]*)* — ноль или более повторений
    • \\. — любой символ с обратной косой чертой (заменить . с [\s\S] если вам нужно также поддерживать экранированные разрывы строк)
    • [^"\\]* — ноль или более символов, кроме двойной кавычки и обратной косой черты
  • " двойная кавычка.

Увидеть regex demo.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]