0

次のような適切に形成された (括弧に関して) 式を変換することは可能ですか?

((a および b) または c) および d

正規表現に変換し、ABCDE (大文字と小文字を区別しない...) などの入力用語で Java または別の言語の組み込みエンジンを使用しますか?

これまでのところ、検索 b および (a または e) に対して (b) (^.?) (a|e)*の行に沿って何かを試しましたが、実際にはうまくいきません。入力文字列に現れる文字「b」と「a」または「e」のいずれかに一致するものを探しています。

プロセスについて-入力文字列を配列に分割し(この正規表現に基づいて)、一致する文字を出力として受け取ることを考えています(AND / OR条件が満たされない場合はなし)。私は正規表現に比較的慣れておらず、あまり時間をかけていないので、私が尋ねていることが不可能であるか、答えが本当に明白である場合は申し訳ありません.

返信ありがとうございます。

4

3 に答える 3

1

括弧がバランスの取れた文字列の言語は正規言語ではありません。つまり、(純粋な)正規表現はそれに一致しません。

これは、開いた括弧を維持するために、ある種のメモリ構造(通常はスタック)が必要なためです。

とは言うものの、多くの言語、特にPerlは正規表現で再帰的な評価を提供します。詳細はわかりませんが、おそらく独自のパーサーを作成できるので、気にするつもりはありません。

文字列内のすべての文字を繰り返し処理し、開き括弧のカウンターと文字列のスタックを追跡します。かっこを開いたら、スタックを押し込み、かっこではない文字をスタックの文字列に入れます。閉じ括弧に到達したら、作成した式を評価し、結果をスタックの一番上にある文字列の後ろに格納します。

繰り返しになりますが、私はあなたが何をしているのか完全にはわかりません。それでは、これが役に立たない場合は、お詫び申し上げます。

于 2009-08-12T20:37:51.770 に答える
1

あなたがやろうとしていることを完全に理解しているとは言えませんが、ここで役立つことがあります。次のようなものから始めます

((a および b) または c) および d

そして、これらの置換ステートメントを介して渡します。

s/or/|/g
s/and| //g
s/([^()|])/(?=.*$1)/g

それはあなたを与えるでしょう

(((?=.*a)(?=.*b))|(?=.*c))(?=.*d)

これは、必要なものに一致する正規表現です。

于 2009-08-12T21:01:11.113 に答える
0

いいえ。正規表現は、開き括弧と閉じ括弧が一致することを確認するのに十分な計算能力を備えていません。形式文法を使用してそれを記述できるものが必要です。

于 2009-08-12T20:35:32.320 に答える