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

Javascript 将带有嵌套引号的命令字符串解析为参数和标志,javascript,node.js,string,parsing,command,Javascript,Node.js,String,Parsing,Command,我正在尝试为Discord bot创建一个命令解析器,以便它在接收消息时使用,但在处理嵌套引号时遇到了问题。我这样做是为了让它可以解析带有双引号和标志的字符串,但它不处理嵌套引号 以下是我的要求: 处理双引号 处理嵌套的双引号 句柄标志(可以在!command之后的任何位置)。 没有指定值的标志默认值为true/1 例如,以下字符串: !命令--可以“处理双引号”和“嵌套双引号”--以及--well=as--flags=“with value” …应产生以下参数:命令,即,处理双引号

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

以下是我的要求:
  • 处理双引号
  • 处理嵌套的双引号
  • 句柄标志(可以在
    !command
    之后的任何位置)。
    • 没有指定值的标志默认值为
      true
      /
      1
例如,以下字符串:

!命令--可以“处理双引号”和“嵌套双引号”--以及--well=as--flags=“with value”
…应产生以下参数:
命令
处理双引号
和“嵌套双引号”
,以及以下标志:
“can”:true
“as”:true
“well”:“as”
“flags”:“with values”

以下是我到目前为止的情况:
//将字符串拆分为单独的参数和标志
const parts=content.slice(1.trim().match(/(-\w+=)?“[^”]*“|[^”]+/g)
.map(arg=>arg.replace(/^“(.*)”$/,“$1”);
//分隔参数和标志
常量[args,flags]=部分。减少((部分,部分)=>{
//检查标志或参数是否正确
if(part.startsWith('--')){
//检查是否具有指定的值
如果(部分包括('=')){
//解析指定的值
part=part.split('=');
常量值=部分切片(1)[0];
零件[1][零件[0]。切片(2)]=值。替换(/^“(.*)”$/,“$1”);
}否则{
部分[1][part.slice(2)]=真;
}
}否则{
零件[0]。推送(零件);
}
返回部件;
}, [[], {}]);

这目前被解析为以下参数:
命令
处理双引号
嵌套
双引号
引号
,以及以下标志:
“can”:true
“as”:true
“well”:“as”
“as”:“as”
“flags”:“带值”< /C> > 

< P>我修改了第一个正则表达式,允许在引用值的中间写<代码> \代码>。以下一行:

const parts=content.slice(1.trim().match(/(-\w+=)?“[^”]*“|[^”]+/g)
…改为:

const parts=content.slice(1.trim().match(/(-\S+=)?“(\\”|[^])*“|[^”]+/g)
修改
  • “[^”]*”
    部分已更改为
    ”(\\“\\”[^”])*“
    ,以允许验证
    \“
    ,防止引用值被前面带有反斜杠的引号终止
  • 我将
    (-\w+=)?
    中的
    \w
    更改为
    \S
    ,导致
    (-\S+=)?
    允许更多的字母进行验证