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

Ruby 在SiriProxy插件中使用命名捕获组,ruby,siri,Ruby,Siri,我正在开发SiriProxy插件。我正在尝试将所有正则表达式移动到配置文件中。可以有多个短语(即正则表达式)触发同一个命令,正则表达式需要捕获特定值以调用底层函数 我可能有一个记录动物相关行为的命令,我想使用以下两个短语: the <mouse> was chased by the <cat> the <cat> chased the mouse 老鼠追赶老鼠 其中“猫”和“鼠标”是两个参数。猫是追逐者,鼠标是追逐者,这两个短语以不同的顺序使用它们。我的

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

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

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

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

因此,我的两个正则表达式如下所示:

/the (?<chasee>\w+) was chased by the (?<chaser>\w+)/i
/the (?<chaser>\w+) chased the (?<chasee>\w+)/i
/(?\w+)被(?\w+)/i跟踪
/(\w+)追逐(?\w+)/i
它们确实正确地捕获了这两个术语,但它们注意按顺序捕获。使用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) }
listen_(/the(?\w+)被(?\w+)/i{chase,chaser | record_animal_behavior(chase,chaser)}
听一听(/the(?\w+)追逐的(?\w+)/i{追逐者,追逐者{记录动物的行为(追逐者,追逐者)}
但是chase和chaser的顺序必须在|字符之间交换。我希望这是标准化的,这样就不管正则表达式短语是什么,也不管它如何对参数排序

当我尝试交换参数时,值也会被交换,导致错误的动物成为追逐者和猎犬。这就好像listen_for命令在将命名的捕获组传递给函数调用时没有“尊重”它们,而是按照顺序进行


有没有人解决过类似的问题,或者使用SiriProxy,或者仅仅使用Ruby regexps?我不知道是否可以用正则表达式本身来强制术语按顺序排列,或者用另一种方式使用listen_for命令来实现这一点。

花了几个小时研究SiriProxy代码,我想我已经找到了我自己问题的答案

在我使用的SiriProxy版本中,Cora::Plugin中的“过程”使用MatchData#capture方法工作,这意味着参数只是按顺序显示,并且没有看起来对命名的捕获组没有真正的支持……当然不是以我想要的方式使用它们


在我的插件中重写这个过程方法,以便使用MatchData对象的数组样式接口(请参见:)访问它,这似乎是我所需要的。因此,我将找出以可扩展方式实现的最佳方法,并对其进行分类。

请尽量使您的问题更简洁。