过滤掉某些单词并只匹配确切的单词

Posted

技术标签:

【中文标题】过滤掉某些单词并只匹配确切的单词【英文标题】:Filter out Certain Words and Match only EXACT Words 【发布时间】:2020-11-12 05:52:50 【问题描述】:

我有一个包含所有股票代码的数组。当用户发布消息'TSLA will open green tomorrow.' 时,我想检测单词'TSLA'。但问题是我的代码也在检测'T''S''LA',因为这些都是有效的股票代码。

所以我创建了一个禁止符号列表,其中包含从 AZ 的每个大写字母。但我不知道如何应用它。

const url = 'https://dumbstockapi.com/stock?format=tickers-only&exchange=NASDAQ,NYSE,AMEX';
const bodyArray = [];
const blockedList = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('');

request(url, (error,  statusCode , body) => 
  return error ? console.log(error) : statusCode == 200 ? bodyArray.push(JSON.parse(body)) : 0;
);

client.on('message', msg => 
  const  content, author:  tag   = msg;
  const [arr] = bodyArray;
  const blocked = arr.indexOf(word => content.toUpperCase().includes(word) > -1);
  if (blocked.length) 
    console.log(`$tag used a word in list.`);
    return msg.delete().catch(console.error);
  
);

【问题讨论】:

您的问题似乎不清楚。请举例说明您希望发生的事情以及目前正在发生的事情。 @DaemonBeast 我已经更新了 你可以forEach数组,把它变成一个对象然后object[stock] @GirkovArpa 击键和整个单词。有人可能会说 TSLA 明天会开绿灯。我想在 Discord 的整个 message.content 中检测 TSLA 这个词,并开始记录一个股票代码在服务器上被说了多少次。 这能回答你的问题吗? Search whole word in string 【参考方案1】:

您需要使用RegExp 来匹配列表中的每个股票代码,但使用\b 边界符号来防止在匹配项中找到匹配项。

const string = 'TSLA will open green tomorrow.  LA will too.';
const symbols = ['T', 'S', 'LA', 'TSLA'];
const regExpString = String.raw`\b`+ symbols.join(String.raw`\b|\b`);
const regExp = new RegExp(regExpString, 'gi');
const matches = string.match(regExp);

console.log(matches); // [ 'TSLA', 'LA' ]

【讨论】:

以上是关于过滤掉某些单词并只匹配确切的单词的主要内容,如果未能解决你的问题,请参考以下文章

Ruby正则表达式过滤掉带有“字符串”后缀的单词结尾

精确匹配正则表达式中的多个单词(数据表)

执行查询搜索以匹配字符而不是确切的单词。

过滤一组以匹配字符串排列

正则表达式用来根据某种匹配模式寻找字符串中的某些单词。

如何匹配文件中的某些单词并列出该匹配单词的所有行? (没有正则表达式)