Discord.js机器人参数解析需求:保留引号内完整参数
解决Discord.js中带引号的参数解析问题
我懂你现在的困扰——原来的空格拆分逻辑会把引号里的内容也拆得七零八落,完全不符合预期。这里给你一个简洁高效的解决方案,用正则表达式实现支持引号的参数解析:
核心代码替换
把你原来的参数拆分代码,替换成下面这段:
// 替换原有的args定义行 const args = message.content.slice(prefix.length).match(/"([^"]*)"|(\S+)/g)?.map(match => { // 识别当前匹配项是否是带引号的内容 const quotedMatch = match.match(/"([^"]*)"/); // 是带引号的就返回引号内的文本,否则直接返回原参数 return quotedMatch ? quotedMatch[1] : match; }) || [];
代码逻辑解释
正则表达式
"([^"]*)"|(\S+):"([^"]*)":匹配被双引号包裹的内容,捕获组会提取出引号内的实际文本(不包含引号)|:逻辑“或”,匹配两种参数格式之一(\S+):匹配连续的非空白字符,也就是不带引号的普通参数g:全局匹配,找出所有符合条件的参数
.map()处理匹配结果:
因为match返回的是带引号的完整字符串(比如"foo1 bar1"),所以我们需要遍历每个匹配项,把引号里的内容单独提取出来,不带引号的参数则直接保留。
实际效果测试
当你输入!give "foo1 bar1" 50 "foo2 bar2"时,args数组会变成:['foo1 bar1', '50', 'foo2 bar2'],完全符合你的需求。
补充说明
如果遇到未闭合的引号(比如!give "foo bar 50),这个正则会把"foo bar当成一个参数。如果你需要严格校验引号是否闭合,可以在解析后加个简单检查,比如判断参数里是否包含未闭合的引号,再给用户返回提示。
内容的提问来源于stack exchange,提问作者Wassim Tahraoui
相关产品推荐
相关产品推荐

