任意の 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注: これらを使用するときは、フラグがオフになっていることを確認する必要があります。