将引号内的内容计算为一个参数

Posted

技术标签:

【中文标题】将引号内的内容计算为一个参数【英文标题】:Count content inside quotes as one argument 【发布时间】:2020-09-18 03:30:42 【问题描述】:

我正在使用 node.js 的 discord.js 模块制作一个不和谐机器人,我有一个基本的参数检测系统,它使用空格作为分隔符并将不同的参数放在一个数组中,这是我的代码的重要部分。 (我使用module.exports 使用单独的命令模块)。

const args = message.content.slice(prefix.length).split(/ +/);
const commandName = args.shift().toLowerCase();
const command = client.commands.get(commandName) || client.commands.find(cmd => cmd.alias && cmd.alias.includes(commandName));

例如,当有人写!give foo 50 bar 时。 args 数组是 ['foo','50','bar'] 我希望args 不在命令中划分命令的引用部分,这意味着如果有人写!give "foo1 bar1" 50 "foo2 bar2"。我希望 args 返回这样的数组 ['foo1 bar1', '50','foo2 bar2'] 而不是 ['foo1','bar1','50','foo2','bar1',]

【问题讨论】:

【参考方案1】:

这可能不是最有效的方法,但我认为它是可以理解的:我们可以扫描每个字符并跟踪我们是在几个引号之内还是之外,如果是,我们忽略空格。

function parseQuotes(str = '') 
  let current = '',
    arr = [],
    inQuotes = false
    
  for (let char of str.trim()) 
    if (char == '"') 
      // Switch the value of inQuotes
      inQuotes = !inQuotes
     else if (char == ' ' && !inQuotes) 
      // If there's a space and where're not between quotes, push a new word
      arr.push(current)
      current = ''
     else 
      // Add the character to the current word
      current += char
    
  
      
  // Push the last word
  arr.push(current)
    
  return arr


// EXAMPLES
// Run the snippet to see the results in the console

// !give "foo1 bar1" 50 "foo2 bar2"
let args1 = parseQuotes('!give "foo1 bar1" 50 "foo2 bar2"')
console.log(`Test 1: !give "foo1 bar1" 50 "foo2 bar2"\n-> [ "$args1.join('", "')" ]`)

// !cmd foo bar baz
let args2 = parseQuotes('!cmd foo bar baz')
console.log(`Test 2: !cmd foo bar baz\n-> [ "$args2.join('", "')" ]`)

// !cmd foo1 weir"d quot"es "not closed
let args3 = parseQuotes('!cmd foo1 weir"d quot"es "not closed')
console.log(`Test 3: !cmd foo1 weir"d quot"es "not closed\n-> [ "$args3.join('", "')" ]`)

【讨论】:

以上是关于将引号内的内容计算为一个参数的主要内容,如果未能解决你的问题,请参考以下文章

Linux 命令中的单引号,不加任何参数以及双引号的作用

C++scanner.h 扫描双引号之间的内容作为标记:不跳过引号内的空格

有关变量定义的单引号双引号无引号区别总结

linux shell中单引号双引号和没有引号的区别

CMD命令中的参数带有双引号,如何转义双引号?

PHP中双引号引起的命令执行漏洞