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