JavaScript字符串解析:标签与文本拆分及边缘场景处理
解决JavaScript字符串拆分标签与文本的边缘场景问题
需求说明
需要将指定格式的字符串拆分为包含tags数组和text字段的对象:
- 标准格式:
@tag1@tag2@tag3:lorem ipsum quare id... - 边缘场景处理:
- 标签数量可为0到n个
- 无标签时字符串无冒号分隔,需返回默认标签
"default"
示例预期输出:
@mario:lorem ipsum→{tags:['mario'], text:"lorem ipsum"}@mario@luigi:lorem ipsum→{tags:['mario','luigi'], text:"lorem ipsum"}lorem ipsum→{tags:['default'], text:"lorem ipsum"}
初始代码问题分析
原代码无法处理无冒号的场景(如tmp3):
- 无冒号时
splitTagText返回的数组仅含一个元素,导致tagText[1]为undefined - 无标签时
extractTags返回空数组,不符合默认标签要求
解决方案
以下是修复后的实现,覆盖所有边缘场景:
function processInput(text) { const colonIndex = text.indexOf(':'); // 无冒号的情况:直接返回默认标签和原文本 if (colonIndex === -1) { return { tags: ['default'], text: text.trim() }; } // 有冒号的情况:拆分标签部分与文本部分 const tagSection = text.slice(0, colonIndex); const contentText = text.slice(colonIndex + 1).trim(); // 提取标签并过滤空字符串(避免开头@导致的空元素) const tags = tagSection.split('@').filter(tag => tag.length > 0); // 若标签数组为空,返回默认标签;否则返回提取的标签 return { tags: tags.length > 0 ? tags : ['default'], text: contentText }; } // 测试示例 const tmp1 = '@mario:lorem ipsum'; const tmp2 = '@mario@luigi:lorem ipsum'; const tmp3 = 'lorem ipsum'; const tmp4 = ':empty tag test'; // 额外测试无标签但有冒号的场景 console.log(processInput(tmp1)); // { tags: ['mario'], text: 'lorem ipsum' } console.log(processInput(tmp2)); // { tags: ['mario', 'luigi'], text: 'lorem ipsum' } console.log(processInput(tmp3)); // { tags: ['default'], text: 'lorem ipsum' } console.log(processInput(tmp4)); // { tags: ['default'], text: 'empty tag test' }
逻辑说明
- 无冒号判断:通过
indexOf(':')检测是否存在冒号,无冒号时直接返回默认标签和原文本 - 标签提取:拆分标签部分后,用
filter过滤掉拆分产生的空字符串(比如开头@导致的空元素) - 空标签处理:如果标签数组为空(如输入
:文本内容),仍返回默认标签,覆盖标签数量为0的场景
内容的提问来源于stack exchange,提问作者giaggi
相关产品推荐
相关产品推荐

