使用正则表达式去除首尾空白字符,保留引号内空白
嘿,我来帮你搞定这个正则的需求!你想要的是只清理双引号之外的多余空白,同时完整保留引号内的空格,对吧?我刚好有合适的方案给你~
解决方案:匹配并替换双引号外的多余空白
核心正则表达式
要精准识别双引号之外的空白字符,我们可以利用正则的正向预查功能,确保匹配的空白不在成对的双引号内部。这里是可以直接用的正则:
\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
相关产品推荐
相关产品推荐

