在JavaScript的字符串处理场景中,我们常常需要将一段文本拆分成独立的单词或短语,但如果文本中包含用双引号包裹的短语,普通的按空格拆分的方式会把短语拆成零散的部分,无法满足实际需求。比如输入字符串"hello "world test" foo",期望拆分结果是["hello", "world test", "foo"],而不是["hello", ""world", "test"", "foo"]。

需求分析
要实现智能拆分,需要满足以下几个核心要求:
- 默认按照空格拆分字符串内容
- 被双引号包裹的内容作为一个整体保留,内部的空格不触发拆分
- 双引号本身不出现在最终的拆分结果中
- 支持处理双引号内部的转义双引号,比如"he said "hi""应该被完整保留为he said "hi"
- 拆分后过滤掉空字符串结果
实现思路
我们可以通过遍历字符串的每个字符,维护一个状态变量来记录当前是否处于双引号内部,同时用一个临时变量存储当前正在拼接的片段,具体逻辑如下:
- 初始化结果数组、当前片段临时变量、是否在引号内的状态标记
- 遍历字符串的每个字符:
- 如果当前字符是双引号,且前一个字符不是转义符,则切换引号状态标记
- 如果当前字符是双引号且是转义符,则将转义后的双引号加入临时片段,跳过下一个字符的遍历
- 如果当前不在引号内,且字符是空格,则将临时片段加入结果数组,重置临时片段
- 其他情况将字符加入临时片段
- 遍历结束后,将剩余的临时片段加入结果数组
- 过滤结果数组中的空字符串,返回最终结果
完整代码实现
下面是符合上述逻辑的JavaScript实现代码:
/**
* 智能拆分字符串,保留双引号内的短语
* @param {string} str 待拆分的字符串
* @returns {string[]} 拆分后的结果数组
*/
function splitStringKeepQuoted(str) {
const result = [];
let current = '';
let inQuote = false;
const len = str.length;
for (let i = 0; i < len; i++) {
const char = str[i];
// 处理转义双引号
if (char === '\' && i + 1 < len && str[i + 1] === '"') {
current += '"';
i++; // 跳过下一个双引号字符
continue;
}
// 处理双引号边界
if (char === '"') {
inQuote = !inQuote;
continue;
}
// 不在引号内遇到空格,拼接当前片段
if (!inQuote && char === ' ') {
if (current) {
result.push(current);
current = '';
}
continue;
}
// 其他字符加入当前片段
current += char;
}
// 处理最后剩余的片段
if (current) {
result.push(current);
}
return result;
}
测试用例验证
我们可以通过多个测试用例验证上述函数的正确性:
// 测试用例1:基础双引号短语 const test1 = 'hello "world test" foo'; console.log(splitStringKeepQuoted(test1)); // 输出:["hello", "world test", "foo"] // 测试用例2:包含转义双引号 const test2 = 'he said "I love "JavaScript"" bar'; console.log(splitStringKeepQuoted(test2)); // 输出:["he", "said", "I love "JavaScript"", "bar"] // 测试用例3:连续空格场景 const test3 = 'a b "c d" e'; console.log(splitStringKeepQuoted(test3)); // 输出:["a", "b", "c d", "e"] // 测试用例4:仅双引号短语 const test4 = '"single phrase"'; console.log(splitStringKeepQuoted(test4)); // 输出:["single phrase"]
边界情况处理
在实际使用中,还需要注意一些边界场景:
- 如果双引号没有闭合,函数会将后续所有内容都当作引号内的内容,直到字符串结束
- 如果字符串开头或结尾有空格,不会生成空的拆分结果
- 单引号包裹的内容不会被特殊处理,会按照普通字符拆分
如果需要支持单引号或者自定义分隔符,可以在上述代码的基础上扩展状态判断逻辑,调整触发拆分的字符条件即可。
JavaScript字符串解析拆分单词保留双引号_短语修改时间:2026-07-10 15:54:24