我正在尝试制作一个与服务器进行一些交互的不和谐机器人。
我已经写了一些可以工作的代码,但它有一个很大的问题。下面是我的代码:
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}
可能类似于"Player had a bad time“,但我的代码无法正确解析这一点,因为参数的拆分方式。
假设输入了以下命令:
!file GrumpyCrouton "Player had a bad time" Kick "1 Day"
,但是参数实际上会以不同的方式展开,因为第三个参数中有空格,但是正则表达式用空格来拆分所有参数,而不考虑引号。基本上,Discord忽略引号并使用每个单词作为其自己的参数,从而使{punishment}
和{duration}
的参数索引为6和7,而不是2和3,因为每个单词都被算作参数。
下面是我的参数的解读方式:
const args = message.content.slice(config.prefix.length).trim().split(/ +/g);
const command = args.shift().toLowerCase();
如何才能使引号中的字符串作为单个参数而不是多个参数读取?
发布于 2019-08-04 23:52:22
一个简单的正则表达式就可以做到这一点:)
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);
*/
发布于 2018-06-05 11:49:25
您可以找到引号的所有索引,并使用该信息通过将其传递给input.substring来正确拆分输入。像这样的东西应该是有效的:
const input = '!file GrumpyCrouton \"Player had a bad time\" Kick \"1 Day\"';
var raw = input;
raw = raw.split(' ');
let command = raw.splice(0, 1)[0]; // splice out the command (splice returns an array)
let user = raw.splice(0, 1)[0]; // splice out the user
let recompose = raw.join(''); // recompose the string WITHOUT any spaces
let indices = []; // find the indices of the quotation marks
for (var i in recompose) {
let char = recompose[i];
if (char === '"') {
indices.push(i);
}
}
console.log(indices, recompose);
if (indices.length == 4) { // OK!
// use the indices to break up input string into substrings
let reason = recompose.substring(indices[0] + 1, indices[1]);
let punishment = recompose.substring(indices[1], indices[2]).replace('"', '');
let duration = recompose.substring(indices[2], indices[3]).replace('"', '');
console.log(command);
console.log(user);
console.log(reason);
console.log(punishment);
console.log(duration);
} else {
// bad input!
}
你可以在jsfiddle上试试这段代码!
发布于 2018-06-04 06:51:16
您可以添加一个更明确的分隔符,如"|“,并使用拆分(‘|’)
您的输入应为:!file GrumpyCrouton |“玩家玩得不开心”| Kick | "1天“
https://stackoverflow.com/questions/50671649
复制相似问题