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

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

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

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

1 Ответ

0 голосов
/ 06 мая 2018

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...