【问题标题】:Using named capture groups in SiriProxy plugin在 SiriProxy 插件中使用命名捕获组
【发布时间】:2013-08-08 20:07:21
【问题描述】:

我正在开发一个 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 命令来实现这一点。

【问题讨论】:

  • 请尽量让您的问题更简洁。

标签: ruby siri


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-26
    • 2014-09-11
    • 2019-11-01
    相关资源
    最近更新 更多