为了账号安全,请及时绑定邮箱和手机立即绑定

将带有嵌套引号的命令字符串解析为参数和标志

将带有嵌套引号的命令字符串解析为参数和标志

jeck猫 2023-07-29 15:24:05
我正在尝试为 Discord 机器人创建一个命令解析器,以便在收到消息时使用,但我在处理嵌套引号时遇到问题。我已经做到了,它可以解析带有双引号和标志的字符串,但它不处理嵌套引号。这是我的要求:处理双引号。处理嵌套双引号。处理标志(可以位于 后的任何位置!command)。没有指定值的标志默认值为true/ 1。例如,以下字符串:!command that --can "handle double" quotes "and \"nested double\" quotes" --as --well=as --flags="with values"...应该产生以下参数:command、that、handle double、quotes和and "nested double" quotes以下标志:"can": true、"as": true、"well": "as"、"flags": "with values"。这是我到目前为止所拥有的:// splits up the string into separate arguments and flagsconst parts = content.slice(1).trim().match(/(--\w+=)?"[^"]*"|[^ "]+/g)  .map(arg => arg.replace(/^"(.*)"$/, '$1'));// separates the arguments and flagsconst [ args, flags ] = parts.reduce((parts, part) => {  // check if flag or argument  if (part.startsWith('--')) {    // check if has a specified value or not    if (part.includes('=')) {      // parses the specified value      part = part.split('=');      const value = part.slice(1)[0];      parts[1][part[0].slice(2)] = value.replace(/^"(.*)"$/, '$1');    } else {      parts[1][part.slice(2)] = true;    }  } else {    parts[0].push(part);  }  return parts;}, [[], {}]);当前解析为以下参数:、command、that、handle double、quotes、and \、nested和以下标志:、、、。double\ quotes"can": true"as": true"well": "as""flags": "with values"
查看完整描述

1 回答

?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

我修改了第一个正则表达式以允许\"在引号值的中间。以下行:

const parts = content.slice(1).trim().match(/(--\w+=)?"[^"]*"|[^ "]+/g)

...变成:

const parts = content.slice(1).trim().match(/(--\S+=)?"(\\"|[^"])*"|[^ "]+/g)

修改

  • "[^"]*"部分已更改为"(\\"|[^"])*"允许\"验证,防止引用的值被前面带有反斜杠的引号终止。

  • 我将\win更改(--\w+=)?\Sresult in(--\S+=)?以允许验证更多字母。


查看完整回答
反对 回复 2023-07-29
  • 1 回答
  • 0 关注
  • 96 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信