使用正则表达式删除前导/尾随空格,引号除外

Using Regex to remove leading/trailing whitespaces, except for quotes

本文关键字:空格 正则表达式 删除      更新时间:2023-10-16

我正在尝试编写一个正则表达式,该表达式从用户输入字符串中识别空格,引号("...")。例如,如果用户输入

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

但这也会删除引号之间的空格。有什么方法可以使用正则表达式忽略引号之间的空格吗?

您可以添加另一种替代方法来匹配和捕获双引号字符串文字,并使用另一个反向引用将其重新插入到结果中:

input_line = std::regex_replace(
input_line, 
std::regex(R"(^ +| +$|("[^"\]*(?:\[sS][^"\]*)*")|( ) +)"),
"$1$2");

请参阅C++演示。

"[^"\]*(?:\[sS][^"\]*)*"部分匹配一个",然后是 0+ 字符,而不是"字符,然后是 0 次或多次出现任何转义字符(,然后是任何与[sS]匹配的字符),然后是 0+ 个字符,而不是"个字符。

注意我使用了原始字符串文字R"(...)"以避免转义正则表达式转义反斜杠 (R"([sS])"="[\s\S]")。