3

問題は非常に単純に聞こえますが、一連のアクションが特定のパターンから逸脱し、これを行うための巧妙な解決策を見つけられない箇所を検出したいと考えています。

パターンの目的は、何らかの形で通常のシーケンスを記述することです。より具体的には、「アクション シーケンスに含めるべきアクションと含めるべきでないアクション、およびその順序は?」次に、アクション シーケンスをパターンと照合し、偏差とその位置を検出します。

私の最初のアプローチは、正規表現でこれを行うことでした。次に例を示します。

Example 1:
Pattern: A.*BC
Sequence: AGDBC (matches)
Sequence: AGEDC (does not match)

Example 2:
Pattern: ABCD
Sequence: ABD (does not match)
Sequence: ABED (does not match)
Sequence: ABCED (does not match)

Example 3:
Pattern: ABCDEF
Sequence: ABXDXF (does not match)

正規表現を使用すると、エラーを検出するのは簡単ですが、どこで発生したかはわかりません。私のアプローチは、シーケンス内のパターンが見つかるまで、最後の正規表現ブロックを連続して削除することでした。それから私は最後の正しい行動を知り、少なくとも最初の逸脱を見つけました. しかし、これは私にとって最善の解決策ではないようです。さらに、私はすべての逸脱をすることはできません。

私の頭の中の他の魂は、ステート マシン、ANTLR のような注文ツールで動作しています。しかし、彼らが私の問題を解決できるかどうかはわかりません。省略や手数料のエラーを検出し、ユーザーが独自のパターンを作成できるようにしたいと考えています。これを行う良い方法を知っていますか?

4

3 に答える 3

0

入力を照合している間、正規表現エンジンは不一致の場所に関する情報を持っていますが、簡単にアクセスできる方法で提供されない場合があります。

たとえば、式を実装する DFA を考えてみましょう。文字を順番にフェッチし、期待どおりに一致させます。有効な一致がないシーケンス内のポイントに関心があります。

他の実装では行ったり来たりする場合があり、フェッチされた文字の最大アドレスに関心があるでしょう。

Java では、CharSequence 実装を

   java.util.regex.Pattern.matches(String regex, CharSequence input) 

ここで、アクセサー メソッドは最大インデックスを追跡します。

しかし、私はそれを試していません。また、エラーの分類にも役立ちません。

于 2011-05-08T12:37:29.620 に答える
0

マルコフ連鎖を見たことがありますか? http://en.wikipedia.org/wiki/Markov_chain - 予期しない遷移が必要なようです。おそらく隠れマルコフモデルもhttp://en.wikipedia.org/wiki/Hidden_ ​​Markov_Models

于 2011-07-23T22:56:14.717 に答える
0

正規表現のオープンソース実装を見つけて、特定の比較が一致しない場合に失敗したインデックスを返す/設定する/出力する/保存するフックを追加します。または、独自の RE エンジンを作成して (気弱な人向けではありません)、希望どおりに動作するようにします。

于 2012-02-09T00:50:05.473 に答える