JavaScript字符串解析:智能拆分单词并保留双引号短语

JavaScript字符串解析:智能拆分单词并保留双引号短语

在JavaScript中,我们经常需要将文本字符串拆分成独立的词语或短语进行处理。然而,当字符串中包含用双引号括起来的多词短语时,简单的 split(‘ ‘) 方法往往无法满足需求,它会将短语内部的空格也作为分隔符,导致短语被错误地拆分。例如,将 “on time” “flight” 拆分为 [“on”, “time”, “flight”] 而非期望的 [“on time”, “flight”]。为了解决这一挑战,我们需要一种更智能的解析策略,其中有限状态机(Finite-State Machine, FSM)是一种非常有效的方法。

核心概念:有限状态机(FSM)解析

有限状态机是一种数学模型,用于描述系统在不同状态之间转换的行为。在字符串解析的场景中,我们可以定义几个状态来表示解析器当前正在处理的文本类型:

初始/空闲状态 (Initial/Idle State): 解析器等待接收下一个字符,并根据字符类型决定进入何种工作模式。单词模式 (Word Mode): 解析器正在累积一个普通的单词。短语模式 (Phrase Mode): 解析器正在累积一个双引号内的短语。

通过在这些状态之间切换,并根据当前字符和当前状态执行不同的操作,我们可以精确地识别出独立的单词和完整的带引号短语。

实现细节与代码解析

下面我们将通过一个JavaScript函数 splitToWordsWithQuotes 来演示如何使用FSM思想实现字符串的智能分词。

function splitToWordsWithQuotes(str) {    let mode; // 当前解析模式:'word' (普通单词) 或 'phrase' (引号内短语)    const words = []; // 存储最终拆分出的单词和短语    let word = ''; // 临时缓冲区,用于累积当前正在解析的单词或短语    // 辅助函数:将当前累积的word添加到words数组中,并清空word缓冲区    const completeWord = () => {        if (word) { // 只有当word不为空时才添加            words.push(word);            word = '';        }    };    for (let i = 0; i < str.length; i++) {        const c = str[i]; // 当前字符        // 状态一:初始/空闲状态,尚未确定解析模式        if (!mode) {            if (c === ' ') {                continue; // 忽略开头的空格            }            if (c === '"') {                mode = 'phrase'; // 遇到双引号,进入短语模式            } else {                word += c; // 遇到非空格非引号字符,开始累积单词                mode = 'word'; // 进入单词模式            }            continue; // 处理下一个字符        }        // 状态二:已进入某种解析模式        // 遇到双引号        if (c === '"') {            completeWord(); // 结束当前单词或短语的累积            // 切换模式:如果当前是单词模式,遇到引号表示进入短语;反之,表示短语结束进入单词            mode = mode === 'word' ? 'phrase' : 'word';            continue; // 处理下一个字符        }        // 遇到空格        if (c === ' ') {            if (mode === 'phrase') {                word += ' '; // 在短语模式下,空格是短语的一部分,累积到word中                continue; // 处理下一个字符            }            // 在单词模式下,空格是分隔符            completeWord(); // 结束当前单词的累积            // 保持当前模式不变(或可以理解为回到空闲状态等待下一个非空格字符)            continue; // 处理下一个字符        }        // 遇到其他字符(字母、数字等)        word += c; // 累积到当前单词或短语中    }    // 循环结束后,确保将最后一个累积的word添加到words数组中    completeWord();    return words;}

代码解析要点:

mode 变量: 这是FSM的核心,它跟踪解析器的当前状态(’word’ 或 ‘phrase’)。words 数组与 word 缓冲区: word 用于临时存储正在构建的词语或短语,当一个词语/短语完成时,通过 completeWord() 函数将其推入 words 数组。completeWord() 辅助函数: 封装了将缓冲区内容添加到结果列表并清空缓冲区的逻辑,避免代码重复。字符遍历与状态判断: 初始状态 (!mode): 负责跳过前导空格,并根据遇到的第一个非空格字符确定是进入 word 模式还是 phrase 模式。遇到双引号 (c === ‘”‘): 这是一个关键的切换点。它总是表示当前词语/短语的结束,并切换解析模式。遇到空格 (c === ‘ ‘): 在 phrase 模式下,空格被视为短语内容的一部分,直接累积。在 word 模式下,空格被视为分隔符,触发 completeWord()。遇到其他字符: 无论是 word 模式还是 phrase 模式,这些字符都被累积到 word 缓冲区中。循环结束后的处理: completeWord() 在循环结束后再次调用,确保字符串末尾的最后一个词语或短语也被正确收集。

示例与输出

让我们使用一些示例来验证这个解析器的功能:

立即学习“Java免费学习笔记(深入)”;

const myStr = '    "hello guys", some     words with "quotes inside"" some spaces inside " please keep quoted words as one "phrase / word" end-of-line ';const mySimpleStr = '"on time" "flight"';console.log('--- 复杂字符串示例 ---');console.log('原始字符串:', myStr);console.log('解析结果:', splitToWordsWithQuotes(myStr));// 预期输出: ["hello guys", ",", "some", "words", "with", "quotes inside", "some", "spaces", "inside", "please", "keep", "quoted", "words", "as", "one", "phrase / word", "end-of-line"]console.log('n--- 简单字符串示例 ---');console.log('原始字符串:', mySimpleStr);console.log('解析结果:', splitToWordsWithQuotes(mySimpleStr));// 预期输出: ["on time", "flight"]

如上所示,splitToWordsWithQuotes 函数能够正确处理前导/尾随空格、多个空格分隔符,以及最关键的——将双引号内的短语作为一个整体进行识别和提取。

注意事项与扩展思考

未闭合的引号: 当前的FSM实现对于未闭合的引号(例如 “hello world)不会抛出错误,而是会将其余部分当作一个普通单词处理。如果需要严格的引号匹配,可能需要引入额外的错误状态或在循环结束后检查 mode 是否仍为 ‘phrase’。

const myWrongStr = '"hello guys", some words" with "quotes inside" please keep quoted words as one "phrase / word" ';console.log('n--- 未闭合引号示例 ---');console.log('原始字符串:', myWrongStr);console.log('解析结果:', splitToWordsWithQuotes(myWrongStr));// 结果可能不是你想要的,例如 "words" 会被拆分成 "words" 而不是 "words"// 并且 "phrase / word" 后的引号没有关闭,会导致后续文本被错误解析

转义引号: 如果字符串中存在转义的引号(例如 “),当前的解析器会将其视为普通字符。要支持转义引号,需要在遇到 字符时增加额外的逻辑来处理。性能: 对于极长的字符串,逐字符遍历的性能通常是可接受的。如果性能成为瓶颈,可以考虑使用更底层的语言特性或优化字符串操作。后续处理: 本文的FSM主要解决了字符串的“拆分”问题。如果需要将拆分后的短语进一步格式化(例如,将 [“on time”, “flight”] 转换为 “”ON TIME”FLIGHT”),则需要在此解析结果的基础上进行二次处理。例如:

const tokens = splitToWordsWithQuotes('"on time" "flight"'); // ["on time", "flight"]const formattedOutput = tokens.map(token => {    if (token.includes(' ')) { // 简单判断是否为多词短语        return `"${token.toUpperCase()}"`;    }    return token.toUpperCase();}).join(''); // 假设需要连接成一个字符串console.log('n--- 格式化示例 ---');console.log('格式化后的输出:', formattedOutput); // ""ON TIME"FLIGHT"

总结

通过采用有限状态机的方法,我们可以构建一个健壮的JavaScript字符串解析器,有效地解决在复杂文本中区分普通单词和带引号短语的挑战。这种方法不仅提供了精确的分词能力,也为处理更复杂的字符串解析需求(如支持转义字符、处理不同类型的引号等)奠定了基础。理解并应用FSM模式,能够显著提升我们处理字符串数据的能力和代码的专业性。

以上就是JavaScript字符串解析:智能拆分单词并保留双引号短语的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1518973.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
文本分词与带引号短语保留的JavaScript实现
上一篇 2025年12月20日 12:02:04
Rollup 组件库构建:解决内部组件 CSS 依赖的声明文件解析难题
下一篇 2025年12月20日 12:02:13

相关推荐

  • MAC怎么查看电池循环次数_MacBook电池循环计数与健康状况查询

    查看MacBook电池健康需通过三种方法:①按Option键点击苹果菜单选“系统信息”,在电源中查“当前循环计数”;②从“关于本机”进入“系统报告”,左侧选“电源”查看循环次数与电池状态;③在“系统设置”中点击“电池”选项,右侧“电池健康”显示最大容量百分比及状态建议。 如果您想了解MacBook的…

    2026年9月7日
    000
  • VSCode代码重构:利用重命名符号与提取函数提升质量

    重命名符号和提取函数是VSCode中提升代码质量的核心操作。通过F2重命名可统一变量名,如将data改为userDataList,增强可读性;选中代码右键提取函数,能拆分冗长逻辑,提高复用性。两者协同使用,如将handleClick中的数据处理抽离为processFormData,并重命名为subm…

    2026年9月7日
    000
  • perplexity安装手册-如何安装perplexity的详细流程

    首先通过官网下载.dmg文件,拖拽安装至应用程序,首次启动需在系统设置中授权,登录账户后检查更新即可完成Perplexity的安装与配置。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 如果您尝试在设备上使用Perplexity应用,但无法…

    2026年9月7日
    100
  • 知网官网AIGC检测 免费查重入口链接

    知网不提供免费AIGC检测或查重服务,均按字符数收费。AIGC检测2元/千字符,论文查重1.5元/千字符,通过https://cx.cnki.net上传文档,单次上限10万字,报告分简洁版和全文版,后者高亮标注疑似AI段落。用户可经学校获取免费权限,个人使用需付费,报告48小时内下载有效,结果仅供参…

    2026年9月7日
    000
  • Win10系统桌面右键新建没有Word、Excel、PPT怎么办?

    Win10系统桌面右键新建没有Word、Excel、PPT怎么办?Win10系统桌面右键新建没有Word、Excel、PPT怎么办?Win10系统桌面右键新建没有Word、Excel、PPT怎么办?Win10系统桌面右键新建没有Word、Excel、PPT怎么办?

    在日常使用电脑时,我们常常会用到word、excel、ppt等工具。通常情况下,安装完office软件后,右键桌面会显示新建word、excel、ppt等选项。然而,近期有用户反映其桌面右键菜单中缺失这些选项。接下来就为大家讲解一下如何解决win10系统中桌面右键无法新建word、excel、ppt…

    2026年9月7日 用户投稿
    200
  • 什么是DLL劫持

    windows操作系统在其基础架构中定义了dll的搜索路径(加载dll文件时需要遵循的目录查找顺序)。如果您能够识别出没有指定绝对路径的可执行文件请求的dll(从而触发此搜索过程),您就可以将包含恶意代码的dll放置在搜索路径的优先位置。这样,windows会在加载官方版本之前找到您的dll,并毫不…

    2026年9月7日
    100
  • 解决SQL Server 2016 JRE7更新问题

    解决SQL Server 2016 JRE7更新问题解决SQL Server 2016 JRE7更新问题解决SQL Server 2016 JRE7更新问题解决SQL Server 2016 JRE7更新问题

    安装sql server 2016时,若系统中缺少必要的运行组件,可能会导致安装过程被中断。其中,未安装合适的java运行环境是较为常见的原因之一。为避免此类问题,应在安装前部署与sql server兼容的jre版本,并正确设置相关环境变量。完成配置后,重新启动sql server安装程序即可继续安…

    2026年9月7日 用户投稿
    000
  • VSCode怎么看页面_VSCode实时预览HTML页面方法与配置教程

    使用Live Server扩展是VSCode中实时预览HTML页面最高效的方法,安装后通过右键“Open with Live Server”或点击底部状态栏“Go Live”启动本地服务器,保存文件时浏览器自动刷新,支持自定义浏览器、端口和排除文件,极大提升前端开发效率。 在VSCode中查看并实时…

    2026年9月7日
    100
  • Win7系统下word如何打钩?

    我们在使用word编辑文档时,经常会遇到需要输入一些特殊符号的情况,例如在word中添加对勾符号。那么,这种符号该如何在word中输入呢?如果你还不了解这方面的知识,那就跟着我一起来学习一下具体的操作步骤吧。 在日常的Word操作过程中,我们有时会遇到需要在方框内添加对勾或叉号的需求。虽然这些小细节…

    2026年9月7日
    100
  • VSCode怎么恢复结果窗口_VSCode输出面板显示与隐藏管理教程

    VSCode恢复结果窗口,其实就是找回或调整你的“输出”面板。它可能因为误操作被关闭了,或者你需要更方便地查看程序的运行结果。下面详细说说怎么搞定它。 输出面板显示与隐藏管理教程: 如何快速找回消失的VSCode输出面板? 最简单的方法就是使用快捷键。 Ctrl + J (Windows/Linux…

    2026年9月7日
    200
  • 毕业后高效利用电子书库

    毕业后高效利用电子书库毕业后高效利用电子书库毕业后高效利用电子书库毕业后高效利用电子书库

    首先,访问上海研发公共服务平台的数字图书服务页面,进入官网后可开始查找所需电子资源。 登录时需在页面右上角填写已注册的账号和密码。若尚未注册,需先前往上海市研发公共服务平台完成用户注册,具体步骤可参考百度经验中关于该平台账号注册的相关教程。 登录成功后,在网页左下角下载Apabi阅读器,并将其安装到…

    2026年9月7日 用户投稿
    000
  • 如何在Linux系统中利用node.js提取Word及PDF文本内容的案例介绍

    这篇文章主要给大家介绍了关于linux系统中利用node.js提取word(doc/docx)及pdf文本的内容,文中给出了详细的示例代码供大家参考学习,需要的朋友们下面跟着小编来一起看看吧。 前言 想要做全文搜索引擎,则需要将word/pdf等文档内容提取出来。对于pdf有xpdf等一些开源方案。…

    用户投稿 2026年9月7日
    100
  • 修复 Prestashop 1.7.7.2 产品变体主图不随属性变化的教程

    修复 Prestashop 1.7.7.2 产品变体主图不随属性变化的教程修复 Prestashop 1.7.7.2 产品变体主图不随属性变化的教程修复 Prestashop 1.7.7.2 产品变体主图不随属性变化的教程修复 Prestashop 1.7.7.2 产品变体主图不随属性变化的教程

    本教程旨在解决Prestashop 1.7.7.2版本中,产品变体(如颜色、尺寸)切换后,主图不随之更新的问题。该问题通常源于主题模板文件中的Smarty变量引用错误。我们将详细指导如何修改product-cover-thumbnails.tpl文件,将 $product.cover 替换为 $pr…

    2026年9月7日 用户投稿
    100
  • Windows10上安装Linux子系统(WSL2,Ubuntu),配合Windows Terminal使用,还要什么自行车

    Windows10上安装Linux子系统(WSL2,Ubuntu),配合Windows Terminal使用,还要什么自行车Windows10上安装Linux子系统(WSL2,Ubuntu),配合Windows Terminal使用,还要什么自行车Windows10上安装Linux子系统(WSL2,Ubuntu),配合Windows Terminal使用,还要什么自行车Windows10上安装Linux子系统(WSL2,Ubuntu),配合Windows Terminal使用,还要什么自行车

    linux 的 windows 子系统可让开发人员按原样运行 gnu/linux 环境 – 包括大多数命令行工具、实用工具和应用程序 – 且不会产生传统虚拟机或双启动设置开销。 WSL 说白了安装Linux就是基于WSL,之前WSL 1 我没使用,现在WSL 2 了于是试了下…

    2026年9月7日 用户投稿
    300
  • Java开发入门必学技能清单

    Java开发入门必学技能清单Java开发入门必学技能清单Java开发入门必学技能清单Java开发入门必学技能清单

    java开发一般指的是javaee方向的开发,从事这一领域需要掌握一系列核心技术,如servlet、jsp、spring框架、hibernate、数据库操作以及web服务等相关知识。 1、 打好JavaSE基础是学习Java开发的前提,无论后续是走JavaEE路线还是转向安卓开发,这都是必不可少的一…

    2026年9月7日 用户投稿
    100
  • 在Java中逻辑运算符有哪些作用

    逻辑与(&&)需两边为真结果才真,左假时右端不执行,具有短路特性,适用于多条件同时满足的场景;2. 逻辑或(||)任一为真即返回真,左真则右端跳过,也具短路性,用于满足其一条件的情况;3. 逻辑非(!)对布尔值取反,常用于否定条件判断;4. 非短路运算符(& 和 |)在布尔表…

    2026年9月7日
    300
  • Java中MAC地址到长整型的正确转换方法

    本文详细阐述了在java中将mac地址字符串正确转换为长整型数值的方法。针对常见的字符串拼接误区,文章深入分析了其错误原因,并提供了基于字节累积乘法运算的专业解决方案,确保48位mac地址能够准确无误地映射为64位长整型,便于存储、比较与处理。 引言 MAC地址(Media Access Contr…

    2026年9月7日
    200
  • 微软通杀漏洞-CVE-2021-1675复现

    微软通杀漏洞-CVE-2021-1675复现微软通杀漏洞-CVE-2021-1675复现微软通杀漏洞-CVE-2021-1675复现微软通杀漏洞-CVE-2021-1675复现

    环境 受害机:window2019(192.168.153.133) 攻击机:kali(192.168.153.134) 利用前提 或许需要:SeImpersonatePrivilege或SeAssignPrimaryTokenPrivilege权限 一定需要:一个普通的域用户 一定需要:开启Spo…

    2026年9月7日 用户投稿
    900
  • PDF转Word怎么转带宏的文件_PDF带宏文件转Word的注意事项

    转换带宏的PDF至Word需注意宏无法直接保留。一、使用支持宏的工具如Adobe Acrobat Pro导出为.docm并启用宏;二、因PDF不原生支持宏,需手动在Word中重建VBA代码并保存为.docm格式;三、通过XPS等中间格式中转,利用开发库提取交互逻辑并迁移到Word宏模块,确保功能一致…

    2026年9月7日
    200
  • 那些年我们开发的应用程序

    那些年我们开发的应用程序那些年我们开发的应用程序那些年我们开发的应用程序那些年我们开发的应用程序

    本文主要介绍了使用java和python语言在windows环境下开发的一些应用程序。所有的ui设计都是在无意识状态下创作的,灵感来源于生活。 weatherweather是一款由Java语言开发的天气预报应用程序,数据来源于Yahoo数据库。它支持22个国家的城市天气预报信息。 mp3_v2是一款…

    2026年9月6日 用户投稿
    200

发表回复

登录后才能评论
关注微信