RegExp作为表条目

时间:2011-04-05 14:10:30

标签: ruby-on-rails regex twilio

我正在构建一个应用程序,通过Twilio从SMS文本获取输入。我想构建一个表格,将传入的SMS正文与相应的响应进行匹配。

例如,想象一下我正在构建一个NFL短信的事情。

'Redskins'中的某些文字和我们发回文章,“红皮队在联邦快递球场打球” 有人在“小马队”中发表文章,我们发回信息,“小马队是印第安纳州的骄傲。”

这是棘手的部分:

当然,我们的Rails应用程序需要通过正则表达式来解释传入的团队名称,因为很多人会发短信:Redskins或REDSKINS或REDSKIN或Redskin或REDskin ......

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

是否有任何人提示从输入阶段获取团队名称,通过数据库表阶段在中间进行'RegExp'转换?

提前致谢。

4 个答案:

答案 0 :(得分:2)

我认为你不想在这里使用正则表达式。拼写错误怎么样?为了获得乐于助人(特别是来自txt msg),我认为你也希望允许缩短。

也许基于Soundex的库或拼写修正最好。你想要一个最接近的匹配算法而不是图案匹配算法。

答案 1 :(得分:2)

对于适度数量的关键字,我建议使用带有关键字和别名的两表方法,始终以小写形式存储。将输入转换为小写。对于每个关键字(例如,红皮),您在别名中手动添加5-10个变体(包括正确的变体),所有变体都具有Alias.keyword_id =关键字的ID。因此,您只需在别名中搜索用户输入,如果找到匹配项,则可以使用关键字的keyword_id。

它有两个优点:快速且易于扩展...如果您记录“无匹配”,您将获得一个新的别名列表,以便添加一次到dbase。比通过正则表达式更容易和更可靠。

答案 2 :(得分:0)

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

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的建议处理错误类型,或者你想要更准确地处理更大的文本,你应该使用一些特定的库。

答案 3 :(得分:0)

我认为你要问的是“如何避免将正则表达式硬编码到我的代码中,因为我可能有很多这些代码,而且它们实际上是一个数据元素”?

如果你想与regexp进行匹配,你应该注意你可以从一个字符串创建一个regexp,这样你就可以很容易地得到一个包含字符串形式的regexp列的表。然后,您可以动态创建正用于搜索传入字符串的正则表达式对象数组。诀窍是当你有一场比赛时该怎么做。您需要开发一组规则(还有另一个表),它基本上根据传入的文本说明要选择哪个响应。例如,如果您的规则只是“根据团队名称进行匹配并说出他们在哪里玩”,那就非常简单了。您正在搜索的每个正则表达式都映射到一个动作(“The Bears play in Chicago”)。如果您的规则更复杂(寻找熊,然后查看“计划”一词是否也在“第一个游戏”中,那么您需要另一个表格来映射一个集合匹配回应。