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

我正在尝试为 Discord 机器人创建一个命令解析器,以便在收到消息时使用,但我在处理嵌套引号时遇到问题。我已经做到了,它可以解析带有双引号和标志的字符串,但它不处理嵌套引号。

这是我的要求:

  • 处理双引号。

  • 处理嵌套双引号。

  • 处理标志(可以位于 后的任何位置!command)。

    • 没有指定值的标志默认值为true1

例如,以下字符串:

!command that --can "handle double" quotes "and \"nested double\" quotes" --as --well=as --flags="with values"

...应该产生以下参数:commandthathandle doublequotesand "nested double" quotes以下标志:"can": true"as": true"well": "as""flags": "with values"

这是我到目前为止所拥有的:

// splits up the string into separate arguments and flags

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

  .map(arg => arg.replace(/^"(.*)"$/, '$1'));


// separates the arguments and flags

const [ 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;

}, [[], {}]);

当前解析为以下参数:、commandthathandle doublequotesand \nested和以下标志:、、、。double\ quotes"can": true"as": true"well": "as""flags": "with values"



jeck猫
浏览 97回答 1
1回答

宝慕林4294392

我修改了第一个正则表达式以允许\"在引号值的中间。以下行:const parts = content.slice(1).trim().match(/(--\w+=)?"[^"]*"|[^ "]+/g)...变成:const parts = content.slice(1).trim().match(/(--\S+=)?"(\\"|[^"])*"|[^ "]+/g)修改该"[^"]*"部分已更改为"(\\"|[^"])*"允许\"验证,防止引用的值被前面带有反斜杠的引号终止。我将\win更改(--\w+=)?为\Sresult in(--\S+=)?以允许验证更多字母。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript