我有一个充满技能的数据库,我正在尝试创建一个info cmd,如果您键入技能名称,您将获得有关它的一些信息。有些技巧是2-3个论点。例如“动物叫声”。我希望能够通过输入!info animal call和像!info ani call这样的缩写来找到我在mongodb中的技能
关于这个的问题是,如果我试图用!info ani call找到它,它不会显示出来。
下面是我的代码:
let skill = args.slice(0).join(" ");
const skillDB = await Skill.find({})
for (let i = 0; i < skillDB.length; i++) {
if (skillDB[i].skillName.toLowerCase().includes(`${skill.toLowerCase()}`)) {
const embed = new MessageEmbed()
.setDescription(`\`${skillDB[i].skillIcon}\` ${skillDB[i].skillName}`)
.setImage(skillDB[i].skillImg)
return message.channel.send(embed)
}
}发布于 2021-02-16 19:41:09
我认为您需要在这里使用某种正则表达式。您可以通过.*将参数连接起来,并将其用作正则表达式,而不是通过空格join参数。
.*可以匹配任何字符,所以当您加入['ani', 'call']时,它将变成一个类似于'ani.*call'的字符串。作为正则表达式模式,/ani.*call/匹配任何同时包含ani和call的字符串(按此顺序)。
const args = ['ani', 'call']
const regex = new RegExp(args.join('.*'), 'i')
console.log(`Words matching ${regex}:`)
console.log('animal', regex.test('animal'))
console.log('animal call', regex.test('animal call'))
console.log('anime caller', regex.test('anime caller'))
console.log('anicall', regex.test('anicall'))
console.log('animal cruelty', regex.test('animal cruelty'))
console.log('anemia caribou', regex.test('anemia caribou'))
如果您不想匹配之间没有任何额外字符的单词,可以使用.+连接这些单词。使用+符号要求两个字符串之间至少有一个额外的字符;这样它就不会与anicall匹配
const args = ['ani', 'call']
const regex = new RegExp(args.join('.+'), 'i')
console.log(`Words matching ${regex}:`)
console.log('animal', regex.test('animal'))
console.log('animal call', regex.test('animal call'))
console.log('anime caller', regex.test('anime caller'))
console.log('anicall', regex.test('anicall'))
console.log('animal cruelty', regex.test('animal cruelty'))
console.log('anemia caribou', regex.test('anemia caribou'))
您还可以使用[a-z\s]+仅接受a-z范围内的字符和空格:
const args = ['ani', 'call']
const regex = new RegExp(args.join('[a-z\\s]+'), 'i')
console.log(`Words matching ${regex}:`)
console.log('animal', regex.test('animal'))
console.log('animal call', regex.test('animal call'))
console.log('anime caller', regex.test('anime caller'))
console.log('anicall', regex.test('anicall'))
console.log('animal cruelty', regex.test('animal cruelty'))
console.log('anemia caribou', regex.test('anemia caribou'))
使用当前代码,您可以使用.test()方法而不是.includes()。它搜索正则表达式和指定字符串之间的匹配。
您还可以使用for ... of循环来代替for循环,以使其更具可读性:
const regex = new RegExp(args.join('[a-z\\s]+'), 'i');
const skills = await Skill.find({});
const embed = new MessageEmbed();
for (let skill of skills) {
if (regex.test(skill.skillName)) {
embed
.setDescription(`\`${skill.skillIcon}\` ${skill.skillName}`)
.setImage(skill.skillImg);
return message.channel.send(embed);
}
}我不明白为什么你要从数据库中获取每一项技能。您还可以将find()或findOne()与上面的正则表达式一起使用,以仅获取所需的数据:
const regex = new RegExp(args.join('[a-z\\s]+'), 'i');
// findOne returns a single object or null if not found
const skill = await Skill.findOne({
skillName: { $regex: regex },
});
if (!skill) {
return message.channel.send(
`Oops, I couldn't find any skill in the database for \`${args.join(' ')}\``,
);
}
const embed = new MessageEmbed()
.setDescription(`\`${skill.skillIcon}\` ${skill.skillName}`)
.setImage(skill.skillImg);
return message.channel.send(embed);

https://stackoverflow.com/questions/66217802
复制相似问题