0

私は 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) }

しかし、チェイシーとチェイサーの順序は | の間で入れ替える必要があります。文字。これを標準化して、正規表現のフレーズが何であるか、およびパラメーターの順序が問題にならないようにしたいと考えています。

パラメータを交換しようとすると、値も交換され、間違った動物が追跡者と追跡者になってしまいます。これは、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 に答える