Ruby on rails RegExp作为表项

Ruby on rails RegExp作为表项,ruby-on-rails,regex,twilio,Ruby On Rails,Regex,Twilio,我正在构建一个应用程序,通过Twilio从SMS文本获取输入。我想建立一个表,将传入的SMS正文与相应的响应相匹配 例如,假设我正在构建一个NFL文本消息 有人在“红人队”发短信,我们回短信,“红人队在联邦快递场比赛” 有人用“小马”发短信,我们回复,“小马是印第安纳州的骄傲。” 这里是棘手的部分: 当然,我们的Rails应用程序将需要通过正则表达式解释传入的团队名称,因为许多人会在其中输入文本:Redskins或Redskins或REDSKIN或REDSKIN 对于一个或两个团队,可以将Reg

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

例如,假设我正在构建一个NFL文本消息

有人在“红人队”发短信,我们回短信,“红人队在联邦快递场比赛” 有人用“小马”发短信,我们回复,“小马是印第安纳州的骄傲。”

这里是棘手的部分:

当然,我们的Rails应用程序将需要通过正则表达式解释传入的团队名称,因为许多人会在其中输入文本:Redskins或Redskins或REDSKIN或REDSKIN

对于一个或两个团队,可以将RegExp和响应硬编码到控制器中……但是对于30个团队,这似乎是错误的。(还有120个参赛者——比如说所有职业运动员——甚至更糟)

是否有任何关于从输入阶段获得团队名称的提示,通过DB表级,中间的“ReGEXP”转换?


提前谢谢。

我想您不需要这里的regexp。拼写错误呢?对于帮助(特别是来自txt消息),我认为您也希望允许缩短


也许一个基于数据库或拼写更正的东西会是最好的。您需要的是最接近的匹配算法,而不是模式匹配算法。

如果文本消息不太长,您应该首先将其切碎为单词,然后与团队名称列表相交

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硬编码到代码中,因为我可能有很多,而且它们实际上是一个数据元素”


如果要与regexp进行匹配,应该注意,可以从字符串创建regexp,这样就可以轻松地创建一个包含字符串形式的regexp列的表。然后可以动态创建用于搜索传入字符串的regexp对象数组。诀窍是当你有比赛时该做什么。您需要开发一组规则(另一个表),基本上说明根据传入的文本选择哪个响应。例如,如果你的规则只是“根据球队名称进行比赛,并说出他们在哪里比赛”,那就很容易了。您正在搜索的每个regexp映射到一个动作(“芝加哥的熊队”)。如果你的规则更复杂(寻找空头,然后看看“时间表”和“第一场比赛”是否也在里面),那么您需要另一个表来将匹配集合映射到响应。

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


它有两个优点:快速且易于扩展…我建议您记录“无匹配项”,您将获得一个新别名列表,以便在数据库中添加一次。这比尝试通过正则表达式进行操作更简单、更可靠。

不客气。我在stackoverflow方面得到了很多帮助,当我有机会回报时,我很高兴!