Dart/Flutter 如何检测文本是否包含列表中任意字符串并返回匹配项
解决方案
最简实现(返回第一个匹配到的元素)
用数组find()方法即可同时满足「判断是否命中」和「返回命中的具体元素」需求,代码如下:
// 统一维护匹配关键词列表,后续增删只需要改这个数组 const matchList = ['my name is', 'people call me', 'i am', 'you can call me']; // 提前将输入文本转小写,避免重复执行转小写逻辑 const lowerText = text.toLowerCase(); // 查找第一个匹配的关键词,无匹配则返回undefined const matchedKeyword = matchList.find(item => lowerText.includes(item.toLowerCase())); if (matchedKeyword) { // 这里matchedKeyword就是匹配到的列表元素,可以直接使用 // 你的业务逻辑 console.log('匹配到的关键词:', matchedKeyword); }
说明:
- 关键词也做了转小写处理,兼容列表元素存在大小写混合的场景,如果你的列表元素固定全小写,可以省略
item.toLowerCase() - 注意JS原生字符串没有
contains方法,你原有代码里的方法名有误,正确的包含判断方法是includes
扩展实现(返回所有匹配到的元素)
如果需要获取所有命中的关键词,把find()替换为filter()即可:
const matchedKeywords = matchList.filter(item => lowerText.includes(item.toLowerCase())); if (matchedKeywords.length > 0) { console.log('所有匹配到的关键词:', matchedKeywords); // 执行业务逻辑 }
旧环境兼容写法
如果运行环境不支持ES6的includes方法,可以替换为indexOf判断,效果完全一致:
// 把includes判断换成indexOf判断 const matchedKeyword = matchList.find(item => lowerText.indexOf(item.toLowerCase()) !== -1);
内容的提问来源于stack exchange,提问作者Sunshine
相关产品推荐
相关产品推荐

