首页 > 解决方案 > Javascript - 如何知道另一个字符串中有多少字符串匹配?

问题描述

我一直在实施一个简单的英语测验。在那,我们需要验证用户在输入字段中输入的答案。在当前的实现中,我正在将正确答案与用户的答案进行精确比较。喜欢,

HTML

<input type="text" id="answer" />
<button onclick="validate()">Validate</button>

Javascript

var question = "Do you like movies?",
    answer = "No, I don't like movies.";

function validate() {
    var userInput = document.getElementById('answer').value;
    if(answer == userInput) {
      console.log("correct");
    } else {
      console.log("wrong");
    }
}

但我不想完全验证。喜欢,忽略区分大小写、逗号、撇号等。例如,如果用户输入,

我不喜欢电影

答案可能是正确的。我不知道如何开始以及从哪里开始。任何人请帮忙。

标签: javascriptregexstringsubstring

解决方案


一种选择是去除所有非单词字符和空格,并比较每个替换字符串的小写版本:

var question = "Do you like movies?",
  answer = "No, I don't like movies.";

const normalize = str => str
  .replace(/[^\w ]/g, '')
  .toLowerCase();
function validate(userInput) {
  const noramlizedInput = normalize(userInput)
  const noramlizedAnswer = normalize(answer);
  if (noramlizedInput == noramlizedAnswer) {
    console.log("correct");
  } else {
    console.log("wrong");
  }
}
validate('No i dont like movies');
validate("NO!!!!! I DON''t like movies.");

另一种选择是遍历所有可能的子字符串,userInput并找出与期望重叠最多的子字符串answer,但这要复杂得多。

一个更简单的选择是检查有多少重叠的单词

var question = "Do you like movies?",
  answer = "No, I don't like movies.";

const normalize = str => str
  .replace(/[^\w ]/g, '')
  .toLowerCase()
  .split(/\s+/)
function validate(userInput) {
  const noramlizedInputArr = normalize(userInput);
  const noramlizedAnswerArr = normalize(answer);
  const overlapCount = noramlizedInputArr.reduce((a, word) => (
    a + Number(noramlizedAnswerArr.includes(word))
  ), 0);
  console.log(overlapCount);
  if (overlapCount >= 4) {
    console.log("correct");
  } else {
    console.log("wrong");
  }
}
validate('No i dont like movies');
validate("NO!!!!! I DON''t like movies.");
validate("i dont like movies.");
validate("Yes I like movies.");


推荐阅读