0

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

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

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

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

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

/the (?<chasee>\w+) was chased by the (?<chaser>\w+)/i
/the (?<chaser>\w+) chased the (?<chasee>\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) }

但是追逐者和追逐者的顺序必须在|之间交换。人物。我希望这是标准化的,这样正则表达式短语是什么以及它如何对参数进行排序都无关紧要。

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

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

4

1 回答 1

0

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

在我使用的 SiriProxy 版本中,Cora::Plugin 中的“进程”使用 MatchData#capture 方法工作,这意味着参数只是按顺序呈现,并且看起来没有对命名捕获组的真正支持......确定不是我想使用它们的方式。

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

于 2013-08-08T21:56:28.660 回答