1

私はC++ソースファイル上で実行されるC#プログラムを作成し、次のものを探しています。

 #define SOMETHING_A    99

typedef enum {
  EX_A,
  EX_B,
  EX_C,
  EX_D,
  EX_E
} Examples;

enum EXAMPLE2
{
    EX2_A=0,
    EX2_B=1,
    EX2_C=2,
    EX2_D=3,
    EX2_LAST = EX2_D
};

私の目的は、次のペアのリストを出力として取得することです。

{SOMETHING_A,99}
{EX_A,0}
{EX_B,1}
..
..
{EX2_A,0}
{EX2_B,1}
..
..

上記の3つのパターンに一致する正しい正規表現を見つけるのを手伝ってもらえますか?

4

1 に答える 1

2

任意の C++ ファイルで機能するソリューションが必要な場合は、正規表現の代わりにパーサーを使用してください。考慮すべき可能性が多すぎます (さまざまなコード スタイル、コメント アウトされたコードなど)。

既知の一連のファイルに対してのみこれを実行したい場合、それらの形式とスタイルが予測可能であれば、おそらく正規表現で問題ありません。実際には、いくつかの正規表現を使用した方がよいでしょう:

/^#define\s+(\S+)\s+(\S+)/

これは、行の先頭にある define ステートメントにのみ一致します。

typedef列挙型は次のとおりです。

/^\s*typedef\s+enum\s*\{[^\}]+\}[^;]+;/

(これから何を取得したいのか明確ではないため、何もキャプチャしていません)。

そして、これが列挙型です。これは、次の 2 つの手順で行うのが最適です。

/^\s*enum\s+(\S+)\s*\{\s*([^\}]+?)\s*\}\s*;/

最初のステップでは、最初のキャプチャ グループの列挙型の名前と 2 番目のグループのコンテンツを取得します。2 番目のキャプチャ グループで正規表現を実行して、フィールドと値を取得します。

/(\S+)\s*=\s*([^\s\,]+)/

これに一致するたびに、名前と値のペアが 1 つ得られます。

これらの正規表現は、例を処理する必要があり、C++ コードで最も一般的な使用法を適切に処理する必要があります。しかし、それらは完全ではありません。考えられるすべての構造をカバーするソリューションが必要な場合は、正規表現を使用しないでください。

match_single_line注: これらを使用するときは、フラグがオフになっていることを確認する必要があります。

于 2013-02-21T11:52:48.100 に答える