如何检查字符串是否包含单词

时间:2020-07-04 20:54:15

标签: javascript twilio

我在编码/ JavaScript方面并不是真正的高级,所以我雇了一个人来编写一个功能,该功能应该检查SMS消息(在名为Twilio的Web服务中),并确定它是否包含肯定或否定词。

他写了下面的代码。但是,问题在于此代码仅检测到子字符串,而不检测到单词。

在这种情况下,“ No”和“ Nowhere”或“ Yes”和“ Yesterday”一词之间没有区别。因此,我需要它仅检查单词,而不仅仅是字母。

有人可以帮我吗?

这是代码:

var event = {
  Body: 'this is a test with some words'
};

var str = event.Body.toLowerCase();
var positive_pattern = ['yes', 'yeah', 'sure', 'of course', 'yup', 'i do', 'i have', 'certainly', 'yep', 'you bet'];
var negative_pattern = ['no', 'nope', 'stop'];

function contains(target, pattern) {
  var value = 0;
  pattern.forEach(function(word) {
    value = value + target.includes(word);
  });
  return (value > 0);
}

var positive = contains(str, positive_pattern);
var negative = contains(str, negative_pattern);
console.log({
  positive,
  negative
});

callback = (_, msg) => console.log(msg);

if (positive === true && negative === false)
  callback(null, 'positive');

else if (positive === false && negative === true)
  callback(null, 'negative');

else if (positive === true && negative === true)
  callback(null, 'negative');

else if (positive === false && negative === false)
  callback(null, 'unknown');

2 个答案:

答案 0 :(得分:0)

您可以使用正则表达式单词边界\b

function contains(target, pattern) {
  var value = 0;
  pattern.forEach(function(word) {
    value = value + new RegExp("\\b" + word + "\\b")).test(target);
  });
  return (value > 0);
}

由于只需要匹配一个单词,就可以使用Array#some

function contains(target, pattern) {
  return pattern.some(word=>new RegExp("\\b" + word + "\\b")).test(target));
}

如果单词可能包含正则表达式元字符,则可以将target拆分为空白字符,并检查结果数组是否包含每个单词。

function contains(target, pattern){
    const parts = target.split(/\s+/);
    return pattern.some(word=>parts.includes(word));
}

答案 1 :(得分:0)

我们需要确保整个单词匹配,这可以通过将目标字符串按空格分开来实现。

var positive_pattern = ['yes', 'yeah', 'sure', 'of course', 'yup', 'i do', 'i have', 'certainly', 'yep', 'you bet'];
var negative_pattern = ['no', 'nope', 'stop'];

function contains(target, patterns) {
  // at least one match?
  return patterns.filter(
    word => target.split(/\s+/).includes(word)
  ).length > 0;
}

function Test(callback, str) {
  var positive = contains(str, positive_pattern);
  var negative = contains(str, negative_pattern);

  if (positive === true && negative === false)
    callback(null, 'positive');

  else if (positive === false && negative === true)
    callback(null, 'negative');

  else if (positive === true && negative === true)
    callback(null, 'negative');

  else if (positive === false && negative === false)
    callback(null, 'unknown');
}

const testCallback = (_, msg) => console.log(msg);
const tests = [
  'yesterday nowhere', // unknown
  'yes',               // positive
  'yes no yeah',       // negative (mixed)
  'nope'               // negative
];

for (const testString of tests)
  Test(testCallback, testString);