Node.js处理含转义符、引号的行文本分词,是否有简便内置方案?
解决方案
Node.js 没有内置的专门方法处理这类类Shell规则的行拆分需求,但可以用以下两种简单方案实现,无需手动逐字符遍历判断边界:
方案1:正则匹配实现(兼容所有Node.js版本)
通过正则直接匹配所有符合规则的token,再做简单的转义、引号处理即可:
const parseLine = (line) => { return line.match(/(\\.|[^"\s])+|"([^"]*)"/g) .map(token => { // 处理引号包裹的内容 if (token.startsWith('"')) return token.slice(1, -1) // 去掉转义字符 return token.replace(/\\(.)/g, '$1') }) } // 测试效果 const testLine = String.raw`https://youtu.be/hdA_rpOXFws Ouroboros\ ~Infinite\ Circulation~ "Ouroboros ~Infinite Circulation~" VOEZ DLight` console.log(parseLine(testLine)) // 输出: // [ // 'https://youtu.be/hdA_rpOXFws', // 'Ouroboros ~Infinite Circulation~', // 'Ouroboros ~Infinite Circulation~', // 'VOEZ', // 'DLight' // ]
该正则已经覆盖了转义空格、双引号包裹内容的场景,日常使用足够。
方案2:调用内置readline模块方法(v18.11.0+支持)
如果你的Node.js版本高于18.11.0,可以直接使用readline模块原生提供的split方法,该方法原生实现了带转义、引号的行拆分逻辑,无需额外处理:
const { split } = require('readline') const testLine = String.raw`https://youtu.be/hdA_rpOXFws Ouroboros\ ~Infinite\ Circulation~ "Ouroboros ~Infinite Circulation~" VOEZ DLight` const tokens = split(testLine) // 输出结果和上面的parseLine完全一致
该方法还支持单引号包裹、嵌套转义等更多边缘场景,稳定性比自行写的正则更高。
内容的提问来源于stack exchange,提问作者guninvalid
相关产品推荐
相关产品推荐

