Использование Regex для удаления начальных / конечных пробелов, кроме кавычек

Я пытаюсь написать регулярное выражение, которое распознает пробелы в строке ввода пользователя, за исключением кавычек (" ... "). Например, если пользователь вводит

     #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;
}

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

Ваш вопрос довольно ясен, однако код, похоже, не имеет много общего. Пожалуйста, разбейте свой вопрос на более мелкие вопросы и предоставьте код, который их демонстрирует.

GalAbra 06.05.2018 17:28

О регулярных выражениях есть своего рода поговорка: «У меня проблема. Я решил ее с помощью регулярных выражений. Теперь у меня проблемы с два». Регулярные выражения могут быть чрезвычайно мощными, но для многих ситуаций они совершенно излишни, не говоря уже о том, что они также чрезвычайно сложны. Обрезка пробелов - это та ситуация, в которой могут быть достаточны другие более простые решения. В вашем случае простого цикла копирования с логическим флагом для «внутренней строки» должно быть более чем достаточно.

Some programmer dude 06.05.2018 17:29

Похоже, вы ищете обрезку ... stackoverflow.com/questions/216823/…

S.Moran 06.05.2018 17:43

@ WiktorStribiżew Готово

Luke Collins 10.05.2018 20:23
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
4
112
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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]").

Другие вопросы по теме