Я пытаюсь написать регулярное выражение, которое распознает пробелы в строке ввода пользователя, за исключением кавычек (" ... "). Например, если пользователь вводит
#load "my folder/my files/ program.prog" ;
Я хочу, чтобы моя замена регулярного выражения превратила это в
#load "my folder/my files/ program.prog" ;
Пока что я реализовал следующее (вы можете запустить здесь).
#include <iostream>
#include <string>
#include <regex>
int main(){
// Variables for user input
std::string input_line;
std::string program;
// User prompt
std::cout << ">>> ";
std::getline(std::cin, input_line);
// Remove leading/trailing whitespaces
input_line = std::regex_replace(input_line, std::regex("^ +| +$|( ) +"), "$1");
// Check result
std::cout << input_line << std::endl;
return 0;
}
Но при этом также удаляются пробелы между кавычками. Есть ли способ использовать регулярное выражение, чтобы игнорировать пробелы между кавычками?
О регулярных выражениях есть своего рода поговорка: «У меня проблема. Я решил ее с помощью регулярных выражений. Теперь у меня проблемы с два». Регулярные выражения могут быть чрезвычайно мощными, но для многих ситуаций они совершенно излишни, не говоря уже о том, что они также чрезвычайно сложны. Обрезка пробелов - это та ситуация, в которой могут быть достаточны другие более простые решения. В вашем случае простого цикла копирования с логическим флагом для «внутренней строки» должно быть более чем достаточно.
Похоже, вы ищете обрезку ... stackoverflow.com/questions/216823/…
@ WiktorStribiżew Готово





Вы можете добавить другую альтернативу для сопоставления и захвата строковых литералов в двойных кавычках и повторно вставить его в результат с другой обратной ссылкой:
input_line = std::regex_replace(
input_line,
std::regex(R"(^ +| +$|(\"[^\"\\]*(?:\\[\s\S][^\"\\]*)*\")|( ) +)"),
"$1$2");
См. Демо C++.
Часть "[^"\\]*(?:\\[\s\S][^"\\]*)*\" соответствует ", затем 0+ символов, кроме \ и ", затем 0 или более вхождений любого экранированного символа (\, а затем любого символа, соответствующего [\s\S]), а затем 0+ символов, кроме \ и ".
Примечание. Я использовал необработанный строковый литерал R"(...)", чтобы избежать необходимости экранировать обратную косую черту в регулярном выражении (R"([\s\S])" = "[\\s\\S]").
Ваш вопрос довольно ясен, однако код, похоже, не имеет много общего. Пожалуйста, разбейте свой вопрос на более мелкие вопросы и предоставьте код, который их демонстрирует.