2

Delphi で正規表現を使用して、C PreProcessor ディレクティブを解決しようとしています。例として、次を含むテキストファイルがあります

#define test
#ifdef test
foo

#else

bar
#endif

私が知りたいのは、最初の試合でそれが ifdef か ifndef かということです。
2 番目の試合では、何を定義する必要があるか (定義しないか) を取得したいと考えています。
3 番目は、#else または #endif までのすべてです。
#else の場合、#else はマッチ 4 のコンテンツである必要があります。
マッチ 5 は再びコンテンツになり、マッチ 6 は
BTW の #endif のみを保持します。一致する \n または \r は気にしません。それらはフィルタリングされます。

私の最初の試みは次の正規表現でした:

/#(ifn?def) +(.*)\n(.*)(#else)?(.*)?(#endif)/si

これは絶対に機能しませんでした。そして、私が何をしようとしても、#ifdef と、定義されるべき (定義されない) キー + 2 番目の一致で他のすべてのものしか取得できません。

正規表現の解決策はありますか? 正規表現はこの種のことに対する最良の解決策ですか?

4

1 に答える 1

3

サブ式 4 と 5 はオプションであるため、貪欲な 2 番目と 3 番目のサブ式#elseは、入力に表示されたとしても、すべてをむさぼり食う結果になります。それらを非貪欲にする必要があります。部分式 4 が一致する場合にのみ部分式 5 が満たされるようにするには、一方を他方の中に入れます。あなたはこれで終わるでしょう:

/#(ifn?def) +(.*?)\n(.*?)(#else(.*))?(#endif)/si

サブエクスプレッション 4 を非キャプチャグループにし、サブエクスプレッション 6 をグループ化する必要はありません。両方の内容がコンテキストによって推測できるからです。

于 2013-09-24T02:53:10.870 に答える