首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >捕获引号中的字符串作为单个命令参数

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

Stack Overflow用户
提问于 2018-06-04 06:44:53
回答 3查看 2.5K关注 0票数 2

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

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

代码语言:javascript
复制
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,因为每个单词都被算作参数。

下面是我的参数的解读方式:

代码语言:javascript
复制
const args = message.content.slice(config.prefix.length).trim().split(/ +/g);
const command = args.shift().toLowerCase();

如何才能使引号中的字符串作为单个参数而不是多个参数读取?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-08-04 23:52:22

一个简单的正则表达式就可以做到这一点:)

代码语言:javascript
复制
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);
 */
票数 6
EN

Stack Overflow用户

发布于 2018-06-05 11:49:25

您可以找到引号的所有索引,并使用该信息通过将其传递给input.substring来正确拆分输入。像这样的东西应该是有效的:

代码语言:javascript
复制
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上试试这段代码!

票数 1
EN

Stack Overflow用户

发布于 2018-06-04 06:51:16

您可以添加一个更明确的分隔符,如"|“,并使用拆分(‘|’)

您的输入应为:!file GrumpyCrouton |“玩家玩得不开心”| Kick | "1天“

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50671649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档