2

たとえば、c * t=>CLASS1とd*g=>CLASS2を分類したいと思います。

Pattern CXT = Pattern.compile("^c.*t$");
Pattern DXG = Pattern.compile("^d.*g$");

public int classify(String in) {
    if (CXT.matches(in)) return CLASS1;
    if (DXG.matches(in)) return CLASS2;
    return -1;
}

モードパターンが多い場合は非常に非効率的です。

すべてのパターンが直交していると仮定すると、1つのDFAで1回のパスで十分であることが簡単にわかります。それで、すべてのパターンを一緒に組み合わせることができるそのような正規表現プロセッサは存在しますか?

4

3 に答える 3

1

dk.brics.automatonパッケージを確認する必要があります。これは、探しているものとは異なりますが、 BSDライセンスを使用した非常に高速なステートマシンの実装です。

したがって、正規表現よりも高速に分類を行うオートマトンを構築できます。

于 2011-05-20T06:48:45.080 に答える
0

あなたは例えば(テストされていない)を行うことができます:

Pattern pat = Pattern.compile("^((c.*t)|(d.*g))$");


public int classify(String in) {
    Matcher m = pat.matcher(in);
    if (m.matches()) {
        if ( m.group(2) != null ) {
             return C;
        }
        else if ( m.group(3) != null ) {
         return D;
        }
    }
    return -1;
}

しかし、これが現在のコードよりも効率的かどうかはわかりません。いずれにせよ、明示的に行うか正規表現に組み込むかにかかわらず、考えられるすべてのパターンについて入力を比較する必要があります。

于 2011-05-20T06:36:13.947 に答える
0
/^((c.*t)|(d.*g))$/

次に、どの一致が見つかったかを確認します。$ 2が表示された場合は、CLASS1を返します。$ 3が表示された場合は、CLASS2などを返します。

于 2011-05-20T06:37:54.433 に答える