【问题标题】:Search string for numbers搜索数字的字符串
【发布时间】:2012-06-07 23:45:17
【问题描述】:

我有一个 javascript 聊天机器人,人们可以在输入框中输入他们喜欢的任何问题并希望得到准确的答案。我可以这样做,但我知道我做错了,因为我不知道数字将出现在句子中的哪个位置。如果有人准确输入:

5 的平方根是多少,这很好用。

如果他输入这样的内容,它不会。

5的平方根是多少

5的平方根是什么

你知道5的平方根是多少

我需要能够确定数字在句子中出现的位置,然后从那里进行计算。请注意,下面的行是更大的工作聊天机器人的一部分。在下面的行中,我只是想能够回答任何平方根问题,而不管数字出现在句子中的什么位置。我也知道开放式输入框有很多陷阱,人们可以在其中输入任何内容,例如拼写错误等。这只是为了娱乐而不是一个严肃的科学项目。 :)

if(
    (word[0]=="what's") &&
    (word[1]=="the") &&
    (word[2]=="square") &&
    (word[3]=="root") &&
    (word [4]=="of") &&
    (input.search(/\d{1,10}/)!=-1) &&
    (num_of_words==6)
){        
    var root= word[5];
    if(root<0){ 
        document.result.result.value = "The square root of a negative number is not possible.";
    }else{
         word[5] = Math.sqrt(root);
         word[5] = Math.round(word[5]*100)/100 
         document.result.result.value = "The square root of "+ root +" is "+ word[5] +"."; 
    }
    return true;
}

为了清楚起见,机器人是出于某种原因使用“If 语句”编写的。如果在这种情况下的输入不包括单词“what”和“square root”以及“some number”,则该行不会触发并由机器人进一步回答为通用“我不知道类型回复”。所以我希望任何答案都适合我使用的格式。客气点,我是新来的。我喜欢制作机器人,但我不是一个程序员。谢谢。

【问题讨论】:

  • 哇。你肯定会把你的娱乐带到高水平。 :)

标签: javascript math nlp string-parsing square-root


【解决方案1】:

您可以使用正则表达式来做到这一点。

"What is the sqrt of 5?".match(/\d+/g);
["5"]

输出是一个数组,其中包含在字符串中找到的所有数字。如果您有多个,例如“100 的平方根是 10 吗?”然后就是

"Is the square root of 100 10?".match(/\d+/g);
["100", "10"]

这样您就可以选择要在脚本中使用的数字。

【讨论】:

  • "Is the meaning of life 42?" --> 6.48
  • 该代码只会为您提供号码,正如原始问题所问的那样。似乎mister movie 已经有办法处理提出的种类问题。
  • 我认为这一点可能不太清楚。 “If 语句”过滤掉所有不必要的信息。如果信息不存在,则 if 语句永远不会触发。所以我知道 if 语句中会有一个数字。我希望像 var root = 不管那个数字是什么。然后对该数字执行简单的计算,例如 sum = Math.sqrt(root);查看原始帖子,我知道 word[5] 是数字。但是,如果措辞不同,数字可能是 word[3] word[4] 等。有没有办法搜索输入。找出数字落在哪里并相应地计算。
  • 是的,我的代码就是这样做的。执行var numbersInString = "What is the sqrt of 5?".match(/\d+/g);,你会得到一个在字符串中找到的数字数组。然后numbersInString[0] 给你第一个数字。
  • 谢谢,我明白你现在在说什么了。
【解决方案2】:

您将需要使用正则表达式,如果您不知道它们是什么,您应该查找它们,因为在此回复中解释它们需要很长时间。这是一个有用的 JavaScript 正则表达式网站https://developer.mozilla.org/en/JavaScript/Guide/Regular_Expressions

假设您知道正则表达式,您应该首先搜索数字并存储您找到的所有数字,如果没有找到数字,则打印出错误消息。作为补充说明,您可能会考虑搜索数学常数,例如 pi 或 e。这应该工作

nums = someString./\d+|pi|e/gi

下一部分会很困难,但归结为核心概念,您需要寻找诸如“平方根”、“倍”或“加号”之类的关键词。你应该从左到右逐字逐句地做这个。例如,如果用户输入

What is 5 plus 3 minus 8?

你应该在减号之前检测加号,如果输入了这个

What is 5 minus 3 plus 8?

您应该在加号之前检测到减号。

对于使用两个数字的运算,您需要获取找到的前两个数字并执行运算并将这两个数字替换为结果。如果您不太了解我要做什么,我正在尝试使用反向波兰表示法,如果不知道它是什么,请查看它。

我希望我正确理解了您的问题,并为找到解决方案提供了一些帮助,因为您提出的问题很难但看起来很有趣。祝你好运。另外作为警告,我没有在回复中考虑操作顺序。

【讨论】:

  • @Pointy 谢谢,我没有意识到 w3schools 可能有害,按照 w3fools 的建议将其更改为 MDN 站点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-11
  • 1970-01-01
  • 2014-10-06
  • 2012-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多