捕获引号中的字符串作为单个命令参数

2023-12-14

我正在尝试制作一个与服务器进行一些交互的 Discord 机器人。

我已经编写了一些可以工作的代码,但它有一个大问题。这是我的代码:

if (command === "file") {

        var accusor = message.author.id;
        var username = args[0];
        var reason = args[1];
        var punishment = args[2];
        var duration = args[3];
        if(!duration) duration = "N/A";
        console.log("Returning last " + amount + " for " + username);
        request.post({url:'http://grumpycrouton.com/kismet/api/post_complaint.php', form: {accusor:accusor,search:username,reason:reason,punishment:punishment,duration:duration}}, function(err,httpResponse,body) { 
            message.reply(body); 
        });
    }

命令是!file {playername} {reason} {punishment} {duration},但问题是,有时少数变量可能有多个单词。例如,{reason}可能是“玩家玩得很开心”之类的内容,但由于参数的分割方式,我的代码无法正确解析它。

假设输入了以下命令:

!file GrumpyCrouton "Player had a bad time" Kick "1 Day"但参数实际上会以不同的方式展开,因为第三个参数中有空格,但正则表达式将所有参数都按空格分割,而不管引号如何。基本上,Discord 会忽略引号并使用每个单词作为它自己的参数,从而使{punishment} and {duration}参数索引为 6 和 7,而不是 2 和 3,因为每个单词都被算作一个参数。

这就是我的论点的解读方式:

const args = message.content.slice(config.prefix.length).trim().split(/ +/g);
const command = args.shift().toLowerCase();

如何才能使引号括起来的字符串被读取为单个参数而不是多个?


一个简单的正则表达式就可以解决问题:)

const input = 'ban user "Look at what you have done!" 7d "This is another string" value';
const regex = new RegExp('"[^"]+"|[\\S]+', 'g');
const arguments = [];
input.match(regex).forEach(element => {
    if (!element) return;
    return arguments.push(element.replace(/"/g, ''));
});
console.log(arguments);

/*
 * Use a function with a spreader like:
 * doSomething(...arguments);
 */
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

捕获引号中的字符串作为单个命令参数 的相关文章

随机推荐