1

次の文字列で式を分割する必要があります。

'with', 'select', 'from', 'where'

これらは私が書いたように順番に来るでしょう。各単語は単語の境界で始まり、単語の境界で終わると想定できます。

私はこれを問題なく実行しました。ただし、新しい要件が到着しました。句にはfrom式全体を含めることができます。

つまり、式は次のようになります。

with
   something
select
   something more
from
   with
      aaaa
   select
      bbbb      
   from
      [may be another expression]
   where
      the inner expression ends here
where
   the outer expression ends here

内側の表現を分割する必要はありません。

さて、問題は、そのようなことをするための標準的な方法はありますか?または、完全に自分で手動で行う必要がありますか?

それが重要かどうかはわかりません。私のアプリケーションはC#のものです。

4

1 に答える 1

3

ユースケースが複雑になり始めているため、正規表現ではなく、実際の解析ユーティリティを使用するために時間とリファクタリングの労力を費やしたほうがよい場合があります。私はC#プログラマーではないので、提案についてはあまりお役に立てませんが、「C#パーサーライブラリ」をグーグルで検索すると、有望に見えるリンクがいくつか見つかりました。

一定レベルのネストしか必要ない場合は、技術的には正規表現で実行できると思いますが、厄介になります。おそらく最も簡単なアプローチは、ネストの固定レベルごとに式を記述し、ヒットするまで上から順に一致させることです。醜いですが、うまくいく可能性があります。

最上位の式に含めることができるネストされた式の数に制限がない場合、正規表現はこれを適切に行うのに十分なほど強力ではないため、解析ユーティリティを確認する必要があります。私は自分でパーサーを書こうとはしません。トリッキーな問題のほとんどを解決する、ほぼ確実に使用可能なライブラリがあります。

于 2011-10-10T04:26:05.520 に答える