You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用正则表达式去除首尾空白字符,保留引号内空白

嘿,我来帮你搞定这个正则的需求!你想要的是只清理双引号之外的多余空白,同时完整保留引号内的空格,对吧?我刚好有合适的方案给你~

解决方案:匹配并替换双引号外的多余空白

核心正则表达式

要精准识别双引号之外的空白字符,我们可以利用正则的正向预查功能,确保匹配的空白不在成对的双引号内部。这里是可以直接用的正则:

\s+(?=(?:[^"]*"[^"]*")*[^"]*$)

正则原理拆解

  • \s+:匹配一个或多个连续的空白字符(包括空格、制表符、换行符等)
  • (?=(?:[^"]*"[^"]*")*[^"]*$):这部分是关键的正向预查,用来验证当前空白的位置:
    • (?:[^"]*"[^"]*")*:匹配零或多组「非引号内容+双引号+非引号内容+双引号」,也就是完整的成对引号块
    • [^"]*$:确保从当前位置到字符串结尾,剩下的内容里没有未闭合的双引号
      简单说就是:当前空白后面的双引号数量是偶数,说明它不在引号内部。

C++代码实现

下面是完整的可运行代码,把引号外的多余空白替换成单个空格,同时完美保留引号内的所有空白:

#include <iostream>
#include <string>
#include <regex>

int main() {
    // 示例输入,包含引号外的多余空白
    std::string input = "#load   \"my folder/my files/ program.prog\"   ;";
    // 编译正则表达式,用原始字符串避免转义麻烦
    std::regex whitespace_re(R"(\s+(?=(?:[^"]*"[^"]*")*[^"]*$))");
    
    // 执行替换:把引号外的多个空白换成单个空格
    std::string result = std::regex_replace(input, whitespace_re, " ");
    
    // 输出结果对比
    std::cout << "原始输入: " << input << "\n";
    std::cout << "处理结果: " << result << "\n";
    
    return 0;
}

运行效果

对于你给出的示例输入,运行后会得到:

原始输入: #load   "my folder/my files/ program.prog"   ;
处理结果: #load "my folder/my files/ program.prog" ;

可以看到,引号外的多个空格被压缩成了单个,而引号内的空白完全没动,正好符合你的需求!

额外适配场景

  • 如果需要完全移除引号外的所有空白(而不是替换成单个空格),只需要把替换字符串改成""就行
  • 如果你的输入里有转义双引号(比如"he said \"hello\""),上面的正则会失效,这时候可以用这个增强版正则:
    \s+(?=(?:[^"\\]*(?:\\.[^"\\]*)*"[^"\\]*(?:\\.[^"\\]*)*")*[^"\\]*(?:\\.[^"\\]*)*$)
    
    它会忽略被转义的\",只把真正的成对引号内部的空白保留下来。

内容的提问来源于stack exchange,提问作者Luke Collins

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:40:03