javascript只匹配数组中的某些字母

javascript只匹配数组中的某些字母,javascript,arrays,matching,Javascript,Arrays,Matching,我在javascript问答聊天机器人中使用了以下内容。例如,回答“元素周期表中的AG是什么?答案是银。” if ((input.search("(what is|what's)") != -1) && (input.search("(periodic table)") != -1)) { document.result.result.value = "Hmmmm, I don't know. Try Google!"; for (i = 0; i < Pe

我在javascript问答聊天机器人中使用了以下内容。例如,回答“元素周期表中的AG是什么?答案是银。”

if ((input.search("(what is|what's)") != -1) && (input.search("(periodic table)") != -1)) {
    document.result.result.value = "Hmmmm, I don't know. Try Google!";
    for (i = 0; i < Periodic_Tables.length; i++) {
        Periodic_Table = Periodic_Tables[i].split('=');
        if (input.indexOf(Periodic_Table[0]) != -1) {
            document.result.result.value = Periodic_Table[1];
        }
    }
    return true;
}

我的问题是因为表格符号只有1或2个字母,它匹配了很多错误的东西。我如何设置为“仅”b和硼匹配,be和铍匹配。等我看了一个单词的边界,但似乎可以在这里找到如何使用它们。

假设聊天框中的问题以元素名称结尾,你可以在标点处拆分字符串。(假设用户输入,what is,ag)


而不是检查输入是否包含符号的此代码块:

if (input.indexOf(Periodic_Table[0]) != -1) {
   document.result.result.value = Periodic_Table[1];
}
您应该像这样检查是否相等:

Periodic_Tables=new Array(

"h=Hydrogen", 
"he=Helium", 
"li=Lithium",
"be=Beryllium",
"b=Boron", 
"c=Carbon", 
"n=Nitro­gen", 
"o=Oxygen",
"f=Fluorine", 
"ne=Neon", 
"na=Sodium",
"mg=Magnesium", 
"ag=Silver" 
);
Periodic_Tables=new Array("h=Hydrogen", 
  "he=Helium", "li=Lithium", "be=Beryllium", "b=Boron", "c=Carbon", "o=Oxygen",
  "f=Fluorine", "ne=Neon", "na=Sodium", "mg=Magnesium", "ag=Silver");

function Parse(input) {
   input=input.toLowerCase(); 
   input=input.replace(/[!|?|,|.]/g,""); 
   if (input.search(/\bu\b/)!=-1) input=input.replace(/\bu\b/,"you");
   if (input.search(/\br\b/)!=-1) input=input.replace(/\br\b/,"are");
   if (input.search(/\bk\b/)!=-1) input=input.replace(/\bk\b/,"ok");
   if (input.search(/\by\b/)!=-1) input=input.replace(/\by\b/,"why");

   var words=input.split(" ");
   var result = "Hmmmm, I don't know. Try Google!";
   if ((input.search("(what is|what's)") != -1) && (input.search("(periodic table)") != -1)) {
       for (var w=0; w<words.length; w++) {
          for (i=0; i<Periodic_Tables.length; i++) {
              Periodic_Table = Periodic_Tables[i].split('=');
              if (words[w] == Periodic_Table[0]) {
                  result = Periodic_Table[1];
                  return result;
              }
          }
       }
   }
   return result;
}
alert(Parse("what is h in periodic table"));
for (i = 0; i < Periodic_Table.length; i++) {
    if (input.indexOf(Periodic_Table[i].Symbol) !== -1) {
        document.result.result.value = Periodic_Table[i].Element;
    }
}
周期表=新数组(“h=氢”,
“he=氦”,“li=锂”,“be=铍”,“b=硼”,“c=碳”,“o=氧”,
“f=氟”,“ne=氖”,“na=钠”,“mg=镁”,“ag=银”);
函数解析(输入){
input=input.toLowerCase();
输入=输入。替换(/[!|?|,|.]/g,“”;
如果(input.search(/\bu\b/)!=-1)input=input.replace(/\bu\b/,“你”);
如果(input.search(/\br\b/)!=-1)input=input.replace(/\br\b/,“are”);
如果(input.search(/\bk\b/)!=-1)input=input.replace(/\bk\b/,“ok”);
如果(input.search(/\by\b/)!=-1)input=input.replace(/\by\b/,“为什么”);
var words=input.split(“”);
var result=“嗯,我不知道。试试谷歌!”;
if((input.search(“(what is | what's)”)!=-1和&(input.search(((周期表)”)!=-1)){

对于(var w=0;w首先,我将使用2d数组来存储元素周期表,这样您就不必每次使用它时都进行字符串拆分。 而不是

Periodic_Tables=new Array(

"h=Hydrogen", 
"he=Helium", 
"li=Lithium",
"be=Beryllium",
"b=Boron", 
"c=Carbon", 
"n=Nitro­gen", 
"o=Oxygen",
"f=Fluorine", 
"ne=Neon", 
"na=Sodium",
"mg=Magnesium", 
"ag=Silver", 
);
使用

假设问题的格式正确,符号“AG”前后都有空格。我认为,如果不区分大小写,您可以简单地根据“AG”或“AG”测试输入。在测试字符串中包含空格将使它能够找到匹配项,即它本身是一个单词,而不是另一个单词的一部分。
Pretty use regex具有类似的功能,但我不确定如何使用regex。

我将使用一个对象数组:

Periodic_Tables = [
{Symbol: "h", Element: "Hydrogen"},
{Symbol: "he", Element: "Helium"}
...
]
然后,您的循环如下所示:

Periodic_Tables=new Array(

"h=Hydrogen", 
"he=Helium", 
"li=Lithium",
"be=Beryllium",
"b=Boron", 
"c=Carbon", 
"n=Nitro­gen", 
"o=Oxygen",
"f=Fluorine", 
"ne=Neon", 
"na=Sodium",
"mg=Magnesium", 
"ag=Silver" 
);
Periodic_Tables=new Array("h=Hydrogen", 
  "he=Helium", "li=Lithium", "be=Beryllium", "b=Boron", "c=Carbon", "o=Oxygen",
  "f=Fluorine", "ne=Neon", "na=Sodium", "mg=Magnesium", "ag=Silver");

function Parse(input) {
   input=input.toLowerCase(); 
   input=input.replace(/[!|?|,|.]/g,""); 
   if (input.search(/\bu\b/)!=-1) input=input.replace(/\bu\b/,"you");
   if (input.search(/\br\b/)!=-1) input=input.replace(/\br\b/,"are");
   if (input.search(/\bk\b/)!=-1) input=input.replace(/\bk\b/,"ok");
   if (input.search(/\by\b/)!=-1) input=input.replace(/\by\b/,"why");

   var words=input.split(" ");
   var result = "Hmmmm, I don't know. Try Google!";
   if ((input.search("(what is|what's)") != -1) && (input.search("(periodic table)") != -1)) {
       for (var w=0; w<words.length; w++) {
          for (i=0; i<Periodic_Tables.length; i++) {
              Periodic_Table = Periodic_Tables[i].split('=');
              if (words[w] == Periodic_Table[0]) {
                  result = Periodic_Table[1];
                  return result;
              }
          }
       }
   }
   return result;
}
alert(Parse("what is h in periodic table"));
for (i = 0; i < Periodic_Table.length; i++) {
    if (input.indexOf(Periodic_Table[i].Symbol) !== -1) {
        document.result.result.value = Periodic_Table[i].Element;
    }
}
for(i=0;i

这可以避免使用正则表达式或2d数组,而且可读性更强。

我似乎无法在Q和机器人中找到任何工作。因此,我在这里展示了一个演示:

或者这里是代码:我尝试了许多不同的答案。也许我没有正确地实现它们

<HTML> 
<HEAD>
<TITLE>ChatterBot Page</TITLE>

<script language="JavaScript">

Periodic_Tables=new Array(

"h=Hydrogen", 
"he=Helium", 
"li=Lithium",
"be=Beryllium",
"b=Boron", 
"c=Carbon", 
"n=Nitro­gen", 
"o=Oxygen",
"f=Fluorine", 
"ne=Neon", 
"na=Sodium",
"mg=Magnesium", 
"ag=Silver" 
);

var message = new Array(); 

var randomnum; 
var flagrandom;

function Parse() { 
var input = new String(document.chat.input.value); 

document.chat.input.value=""; 
input=input.toLowerCase(); 

word=input.split(" ");
num_of_words=word.length;

input=input.replace(/[!|?|,|.]/g,""); 
word=input.split(" ");



if (input.search(/\bu\b/)!=-1) input=input.replace(/\bu\b/,"you");
if (input.search(/\br\b/)!=-1) input=input.replace(/\br\b/,"are");
if (input.search(/\bk\b/)!=-1) input=input.replace(/\bk\b/,"ok");
if (input.search(/\by\b/)!=-1) input=input.replace(/\by\b/,"why");




if ((input.search("(what is|what's)") != -1) && (input.search("(periodic table)") != -1)) {
document.result.result.value = "Hmmmm, I don't know. Try Google!";
for (var i = 0, len = Periodic_Tables.length; i < len; i++) {
if (Periodic_Tables[i].match('^'+input+'=')) {
document.result.result.value = Periodic_Tables[i].split('=')[1] }
}
return true;}


if (!flagrandom) {
randomnum = [Math.floor(Math.random()*3)]
flagrandom=true;}
message[0] = "Sorry, you stumped me on that one.";  
message[1] = "Sorry, a search of my data base comes up empty."; 
message[2] = "Not sure";
document.result.result.value = message[randomnum]; 
randomnum++
if (randomnum>2){randomnum=0}
return true;}


</script> 




</head> 



<BODY BACKGROUND="FFFFFF" TEXT="#0000cc" LINK="#FFCOOO" ALINK="#FFCC99"
VLINK="#FFC000" marginwidth="0" leftmargin="0" topmargin="0" rightmargin="0">
<Center>
<font size="+3">
ChatterBot
</font>
<br>
<img src="botpix.jpg" border="0" WIDTH="200" HEIGHT="200">
<br>
<form name="result">
<textarea rows=5 cols=40 input type="text" name="result">
</textarea><br>
</form>
</center>
<form name="chat" onSubmit="Parse();return false">
&nbsp;<b>Type here:</b> 
<input type="text" name="input" size="100">
</form>



</body> 
</html>

喋喋不休的页面
周期表=新数组(
“h=氢”,
“他=氦”,
“锂=锂”,
“铍=铍”,
“b=硼”,
“c=碳”,
“n=氮”,
“o=氧气”,
“f=氟”,
“ne=霓虹灯”,
“钠=钠”,
“镁=镁”,
“银=银”
);
var message=新数组();
随机变量;
随机变量;
函数Parse(){
var输入=新字符串(document.chat.input.value);
document.chat.input.value=“”;
input=input.toLowerCase();
word=输入。拆分(“”);
单词数=单词长度;
输入=输入。替换(/[!|?|,|.]/g,“”;
word=输入。拆分(“”);
如果(input.search(/\bu\b/)!=-1)input=input.replace(/\bu\b/,“你”);
如果(input.search(/\br\b/)!=-1)input=input.replace(/\br\b/,“are”);
如果(input.search(/\bk\b/)!=-1)input=input.replace(/\bk\b/,“ok”);
如果(input.search(/\by\b/)!=-1)input=input.replace(/\by\b/,“为什么”);
if((input.search(“(what is | what's)”)!=-1和&(input.search(((周期表)”)!=-1)){
document.result.result.value=“嗯,我不知道。试试谷歌!”;
对于(变量i=0,len=Periodic_Tables.length;i2){randomnum=0}
返回true;}
喋喋不休



在此处键入:
从原始代码开始…输入似乎是一个冗长的问句..我不认为你可以只使用相等..我用它来将所有输入更改为小写,这样就不会有问题了;document.chat.input.value=“”;input=input.toLowerCase();这很好,但不是
indexOf
调用您应该是平等的。我无法实现这一点。我在这里提供了一个小演示。frontiernet.net/~wcowart/aademo.html带有可见的源代码。是的,我在本例中试图回答的问题是“周期表中的ag是什么?或者周期表中我放在数组中的任何其他符号。无论我输入什么,这似乎都会触发氢气。我在这里使用的是一个演示,源代码可见