【问题标题】:Using Regex to remove leading/trailing whitespaces, except for quotes使用正则表达式删除前导/尾随空格,引号除外
【发布时间】:2018-05-06 15:24:15
【问题描述】:

我正在尝试编写一个正则表达式,它可以识别用户输入字符串中的空格,引号之间的空格除外 ("...")。例如,如果用户输入

     #load     "my   folder/my  files/    program.prog"     ;

我希望我的正则表达式替换将其转换为

#load "my   folder/my  files/    program.prog" ;

到目前为止,我已经实现了以下内容(您可以运行它here)。

#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 完成

标签: c++ regex c++11


【解决方案1】:

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

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

请参阅C++ demo

"[^"\\]*(?:\\[\s\S][^"\\]*)*\" 部分匹配",然后是除\" 之外的0+ 个字符,然后是0 次或多次出现的任何转义字符(\,然后是与[\s\S] 匹配的任何字符),然后是 \" 以外的 0+ 个字符。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-20
    • 2015-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多