1

今、これは私にとってかなりの挑戦です。

ファイルには約 1000 個のクエリがあり、すべて次のような同様のパターンです。

***\*XYZ#PQR#\****

ここで、 # は任意の数の非空白文字を示します。
上記の行を読み取って、それに応じた正規表現を生成できるコードを既にコーディングしています。
ただし、約 100,000 の候補があり、前述したように、約 1000 のそのようなクエリが一致のために評価されます。
これにより、m*n のオーダーになるため、コードの計算コストが非常に高くなります。

私は ANTLR を経験してきましたが、学習曲線が非常に急であることがわかりました。非常に有望に思えますが、これが Antlr を使用して実現できるかどうか、心の片隅ではまだ疑問があります。あなたの意見やその他の実行可能な解決策を教えてください。

4

3 に答える 3

2

結果A、B、C、.. .

その場合、正規表現 a1、a2、... an を結果 A に、b1、... bm を結果 B に論理的に組み合わせることができます。正規表現の理論的性質を知っている)。

正規表現を表現するためのほとんどのシステム (おそらくあなたのものではない) では、これを次のように書くことができます。

 a1 | a2 | .. | an --> A

または同等の構文。このようなシステムは、多くの場合、いわゆる字句解析器ジェネレーターと関連付けられており、コンパイラーの作成者がトークンの細かい構文を文字で表現できるようにします。

このようなツールの大きな利点は、トークン (のすべての正規表現) を一致させる努力が、多くの場合、正規表現の数に対してサブリニアであることです。正規表現は、セットに対して 1 回だけ認識されます。これは大幅なスピードアップを意味し、あなたのような状況に直接適用されます.

広く利用可能なツール FLEX は、これを非常に効率的に行います。ANTLR には、正規表現として表現されたトークンを認識する何らかのメカニズムがありますが、それが効率的な有限状態マッチャーを生成するかどうかはわかりません。

于 2012-04-08T23:20:35.837 に答える
1

それで終わりました。正規表現では1時間かかり、Lucene、WildCardQueries、および順列を処理するbooleanQueryでは、11分で作業が完了しました。*1週間でFlexを学ぶためのタイムラインがあればいいのにと思います。ただし、Luceneは、大規模なデータセット、正規表現、およびクランチに適したオプションです。それは常にあなたの問題を解決するわけではないかもしれませんが、それはただの別の解決策です。

于 2012-04-17T19:44:24.450 に答える
0

単純な文字列の検索と置換が可能であるため、ANTLRには必要はないと思います:#-> \\.*。アスタリスクは削除する必要があります。

だから*Telecom#Servic#*あなたのためにTelecom\\.*Servic\\.*。文字列の開始/終了をチェックするために$と^を追加することもできます。

于 2012-04-08T20:25:18.010 に答える