在SiriProxy插件中使用命名捕获组

时间:2013-08-08 20:07:22

标签: ruby siri

我正在研究SiriProxy插件。我试图将所有正则表达式移动到配置文件中。可以有多个短语(即正则表达式)触发相同的命令,正则表达式需要捕获特定的值来调用底层函数。

我可能有一个记录动物相关行为的命令,我想用2个短语如下:

the <mouse> was chased by the <cat>
the <cat> chased the mouse

其中“cat”和“mouse”是2个参数。猫是追逐者,鼠标是追逐者,2个短语以不同的顺序使用它们。我的目标(使用siriproxy插件框架,请记住)是使捕获的参数的顺序无关紧要,因此我总是在捕获的术语中知道谁是追逐者和追逐者。

所以,我的2个正则表达式如下所示:

/the (?<chasee>\w+) was chased by the (?<chaser>\w+)/i
/the (?<chaser>\w+) chased the (?<chasee>\w+)/i

他们确实正确地捕获了2个术语,但他们关注的是按顺序捕获。使用SiriProxy框架,我们使用listen_for命令,我可以使用它:

listen_for (/the (?<chasee>\w+) was chased by the (?<chaser>\w+)/i) { | chasee, chaser | record_animal_behaviour(chasee, chaser) }
listen_for (/the (?<chaser>\w+) chased the (?<chasee>\w+)/i) { | chaser, chasee | record_animal_behaviour(chasee, chaser) }

但是chasee和chaser的顺序必须在|之间交换字符。我希望这是标准化的,因此正则表达式短语是什么以及它如何对参数进行排序并不重要。

当我尝试交换参数时,值也会被交换,导致错误的动物成为chasee和cahser。如果listen_for命令没有“尊重”命名的捕获组,因为它将它们传递给函数调用,而只是按顺序执行。

有没有人使用SiriProxy处理类似的东西,或者只使用Ruby regexp?我不知道我是否可以使用正则表达式来强制按顺序排除这些术语,或者使用listen_for命令来实现此目的。

1 个答案:

答案 0 :(得分:0)

花了几个小时挖掘SiriProxy代码,我想我已经找到了解决自己问题的答案......

在我正在使用的SiriProxy版本中,&#34;进程&#34;在Cora :: Plugin中使用MatchData#capture方法,这意味着参数只是按顺序显示,并且看起来没有真正支持命名捕获组......某些不是我想要使用它们的方式。

在我的插件中覆盖此进程方法以使用它的数组样式接口访问MatchData对象(请参阅:http://www.ruby-doc.org/core-2.0/MatchData.html#method-i-5B-5D)似乎可以满足我的需要。所以,我只是想出以可扩展的方式实现的最佳方法,并且应该进行排序。