Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript-如何知道有多少字符串与另一个字符串匹配?_Javascript_Regex_String_Substring - Fatal编程技术网

Javascript-如何知道有多少字符串与另一个字符串匹配?

Javascript-如何知道有多少字符串与另一个字符串匹配?,javascript,regex,string,substring,Javascript,Regex,String,Substring,我一直在实施一个简单的英语测试。在这种情况下,我们需要验证用户在输入字段中输入的答案。在当前的实现中,我将正确答案与用户的答案进行精确比较。像 HTML <input type="text" id="answer" /> <button onclick="validate()">Validate</button> 但我不想完全验证。例如,忽略区分大小写、逗号、撇号等。例如,如果用户输入 我不喜欢电影 答案可能是正确的。我不知道如何开始,从哪里开始。任何人请提

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

HTML

<input type="text" id="answer" />
<button onclick="validate()">Validate</button>
但我不想完全验证。例如,忽略区分大小写、逗号、撇号等。例如,如果用户输入

我不喜欢电影


答案可能是正确的。我不知道如何开始,从哪里开始。任何人请提供帮助。

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

var question=“你喜欢电影吗?”,
回答:“不,我不喜欢电影。”;
常量normalize=str=>str
.替换(/[^\w]/g'')
.toLowerCase();
函数验证(用户输入){
const noramlizedInput=normalize(用户输入)
const noramlizedAnswer=正常化(答案);
if(noramlizedInput==noramlizedAnswer){
控制台日志(“正确”);
}否则{
控制台日志(“错误”);
}
}
验证(“不,我不喜欢电影”);

验证(“不!!!!!我不喜欢电影。”)如果您只想捕捉拼写错误和小的变化,标准度量称为编辑距离或。这是将一个文本更改为另一个文本所需的最小删除、插入或替换次数的计数。像“不,我不喜欢电影”和“不,我不喜欢电影”这样的字符串的编辑距离很小

下面是一个快速而肮脏的递归编辑距离函数,它将为您提供一个想法:

函数验证(文本、模式){
//一些简单的预处理
设p=pattern.toLowerCase().replace(/[^a-z]+/ig',)
让t=text.toLowerCase().replace(/[^a-z]+/ig',)
//记忆递归算法
让矩阵=Array.from({length:t.length+1},()=>[])
函数editDistance(文本,模式,i=0,j=0){
如果(i==text.length&&j==pattern.length)返回0
if(i==text.length)返回pattern.length-j
if(j==pattern.length)返回text.length-i
让选择=[
(矩阵[i+1][j+1]| |(矩阵[i+1][j+1]=editDistance(文本,模式,i+1,j+1))+(文本[i].toLowerCase()==模式[j].toLowerCase()?0:1),
(矩阵[i+1][j]| |(矩阵[i+1][j]=editDistance(文本,图案,i+1,j)))+1,
(矩阵[i][j+1]|(矩阵[i][j+1]=editDistance(文本、图案、i、j+1)))+1
]
返回Math.min(…选项)
}
返回距离(t,p)
}
//类似的字符串具有较小的编辑距离
log(验证(“不,我不喜欢动作”,“不,我不喜欢电影”))
//稍不相似
log(验证(“是的,我喜欢电影”,“不,我不喜欢电影”))
//完全不同
log(验证(“浴室在哪里”,“不,我不喜欢电影”))
//小心--编辑距离小!==近义词

log(验证(“我喜欢吃玉米卷”,“我不喜欢吃玉米卷”)
它不符合question@CertainPerformance,我将代码与我的web应用程序集成。如果成功了,如果我得到足够的声誉,我会举手,勾选你的答案并投票给你。@DhananjaiPai见编辑,我认为计算重叠单词的数量可以work@CertainPerformance验证(“不,我确实喜欢电影。”);验证(不,我喜欢电影)将等同于真,而不管意图是否错误。第二种算法实际上是错误的。我已经为这项工作投票了第一个代码。@Dhananjai Pai:写
还是
也很重要。如果一个人写
Nah,我就不喜欢看电影
它的失败与
Yes
一样。最后我建议多选,它解决了每个用户如何写出不同答案的问题。问题的本质是你想要验证主观答案。目前,这项技术正在开发中。人们正试图通过人工智能实现这一目标。所以我建议你为一个问题写多个答案,因为“不,我不喜欢电影”也是一个正确的答案。因此,尝试使用数组检查答案是否在数组中,并随时间更新数组。
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");
    }
}