1

無制限の文字列シーケンスと、優先度順に並べられた多数の正規表現があります。シーケンス内の各文字列について、最初に一致する正規表現と一致する部分文字列を見つける必要があります。文字列はそれほど長くはありませんが (<1Kb)、正規表現の数は数百から数千までさまざまです。

この仕事を効率的に行う Java ツールを探しています。この手法は、DFA を先に構築する必要があると思います。

私の現在のオプションは JFLEX です。JFLEX で回避できない問題は、ルールに優先順位がなく、JFLEX がテキストの最も長い部分に一致するルールを探すことです。

私の質問は、私の問題が JFLEX で解決できるかどうかです。そうでない場合は、別のJavaツール/テクニックを提案できますか?

4

1 に答える 1

3

Java正規表現を使用できます。'(' と ')+?' で囲まれた各代替を使用して、代替を RE 文字列に構築します。'|' で区切られ、最も優先度の高い RE が最初になります。最初のコンストラクトは、サブ RE をグリーディにするため、後戻りして '|' を使用することはありません。代替は左から右に評価されるため、最も優先度の高い RE が最初に試行されます。

たとえば、「zeroonetwothreefour」という文字列を指定すると、

'(one)+?|(onetwo)+?' will match 'one'
'(onetwo)+?|(one)+?' will match 'onetwo'
'(twothree)+?|(onetwothree)+?' will match 'twothree'

特に最後の例では、'twothree' がターゲット文字列の後半に出現し、'onetwothree' の一致よりも短い場合でも一致することに注意してください

于 2011-10-02T14:15:45.037 に答える