RegExp作为表条目

问题描述:

我正在构建一个应用程序,通过Twilio从SMS文本获取输入。我想建立一个表,匹配传入的SMS正文与适当的响应。RegExp作为表条目

例如,假设我正在构建一个NFL文本消息的事情。在“红人”

有人文本和我们背课文,在“小马” 有人文本和我们背课文,“北美印第安人在联邦快递领域发挥”,“小马队是印第安纳州的骄傲。”

这里是棘手的部分:红皮或红皮或印第安人或北美印第安人或印第安人:

当然,我们的Rails应用程序的人都需要解释通过正则表达式进入球队的名字,很多人会在文本。 ...

有一两个团队,可以将RegExp和响应硬编码到控制器中......但有30个团队,这似乎是错误的。 (有120个参赛作品 - 说所有职业运动 - 更糟糕)。

有没有人有任何提示,从输入阶段获取团队名称,通过数据库表阶段与中间的'RegExp'转换?

在此先感谢。

对于数量不多的关键字,我推荐使用关键字和别名两种表格方式,总是以小写形式存储。将输入转换为小写形式对于每个关键字(比如红皮),手动添加在别名中有5-10个变体(包括正确的一个),所有这些变体都具有Alias.keyword_id =关键字的ID。因此,您只需在用户输入中搜索Alias,并且如果找到匹配项,则您具有关键字的keyword_id。

它有两个优点:快速和容易扩展...我记录了“不匹配”,你将得到一个新的别名列表,一旦添加到数据库。比试图通过正则表达式更容易和更可靠。

+0

哇....奇妙的想法。我要试试这个。谢谢! – DougN 2011-05-16 12:25:38

+0

不客气。我已经在这里获得了很多帮助,并且很高兴当我有机会返回这个优惠时! – jpwynn 2011-05-18 05:24:39

我不认为你想要这里的正则表达式。怎么样拼写错误?为了有用(特别是来自txt msg),我想你也想让缩短。

也许Soundex为基础的库或拼写纠正的事情会是最好的。你想要一个最接近的匹配算法,而不是一个模式匹配。

如果短信不是太长,你应该首先将其切成单词,然后与队名列表交叉。

array_of_team_names = %w(Redskins Colts ...) # keep it all capitalized 
'cOLts blah blah'.scan(/\w+/).map{|word| word.capitalize} & array_of_team_names 
# => ['Colts'] 

如果你想处理输入错误时,通过drysdam建议,或者如果你想以更精确地处理更大的文本,你应该使用一些特定于该库。

我想你所问的是“我怎么避免将正则表达式硬编码到我的代码中,因为我可能有很多它们,它们确实是一个数据元素”?

如果你想用regexp进行匹配,你应该注意到你可以从一个字符串创建一个正则表达式,所以你可以很容易地得到一个包含字符串形式的正则表达式列的表。然后,您可以动态创建您将用于搜索传入字符串的正则表达式对象数组。诀窍是当你有一场比赛时要做什么。您需要制定一套规则(又一个表格),基本上说明根据传入文本选择哪种响应。例如,如果您的规则仅仅是“根据球队名称进行匹配并说出他们的位置”,那很简单。您正在搜索的每个正则表达式都映射到一个动作(“芝加哥的熊游戏”)。如果你的规则更复杂(寻找熊,然后看看“时间表”这个词是否也存在于“第一个游戏”中,那么你需要另一个表来映射一组