JS正则:选择连续多引号场景下不在引号内的所有空格
引号外空格删除与分词实现方案
一、删除引号外空格的正则替换
要删除所有不在双引号内的空格,可使用以下JavaScript正则替换逻辑:
const originalStr = '" Test Test " ab c " Test" "Test " "Test" "T e s t"'; const processedStr = originalStr.replace(/\s+(?=(?:[^"]*"[^"]*")*[^"]*$)/g, ''); // 处理后结果:" Test Test "abc" Test""Test ""Test""T e s t"
正则说明
\s+:匹配一个或多个连续空格(?=(?:[^"]*"[^"]*")*[^"]*$):正向预查确保当前空格处于引号外(?:[^"]*"[^"]*")*:匹配零或多组成对的双引号内容(非引号字符+引号+非引号字符+引号)[^"]*$:确保后续内容中没有未闭合的双引号,保证当前位置在偶数个引号之后(即不在引号内)
二、直接实现分词需求
如果最终目标是得到分词数组,无需先删除空格,可直接用正则匹配提取目标内容:
const str = '" Test Test " ab c " Test" "Test " "Test" "T e s t"'; const tokenizedResult = str.match(/"[^"]*"|\S+/g); // 分词结果:[" Test Test ", "ab", "c", " Test", "Test ", "Test", "T e s t"]
分词正则说明
"[^"]*":匹配所有双引号包裹的内容(保留引号内的空格)\S+:匹配引号外的连续非空格字符(即单个分词单元)
关于你尝试的正则问题
你之前使用的(,|;\s|\s)+(?![^\[]*\])(?![^\(]*\))(?![^\{]*\})(?![^"].*")存在两个核心问题:
- 使用了HTML实体
"而非实际字符串中的双引号",无法正确匹配字符串里的引号 - 引号判断逻辑错误,
(?![^"].*")无法准确识别成对的引号,导致无法区分引号内外的空格
内容的提问来源于stack exchange,提问作者Warren Niles
相关产品推荐
相关产品推荐

