メインコンテンツへスキップ

C言語コード検索に役立つ正規表現パターン集

🌱 はじめに

C言語のコードをgrepで検索するとき、単なる文字列検索ではノイズが多くなりがちです。
この記事では、C言語特有の典型的な正規表現パターン をまとめ、関数や変数の定義・利用を効率よく抽出する方法を紹介します。


🔤 変数関連

変数定義(プリミティブ型)

grep -E "^[[:space:]]*(int|char|float|double|long|short|unsigned)[[:space:]]+[a-zA-Z_][a-zA-Z0-9_]*"

→ 基本型の変数宣言行

定数(マクロ)

grep -E "^[[:space:]]*#define[[:space:]]+[A-Z_][A-Z0-9_]*"

→ マクロ定義された定数

const int なども拾いたい場合は (const[[:space:]]+)? を追加すると良い。


🛠️ 関数

関数定義

grep -E "^[[:space:]]*[a-zA-Z_][a-zA-Z0-9_[:space:]\*]+[[:space:]]+[a-zA-Z_][a-zA-Z0-9_]*[[:space:]]*\("

→ 戻り値+関数名で始まる行

関数プロトタイプ宣言

grep -E "^[[:space:]]*[a-zA-Z_][a-zA-Z0-9_[:space:]\*]+[[:space:]]+[a-zA-Z_][a-zA-Z0-9_]*[[:space:]]*\([^)]*\);"

→ ヘッダファイルでよく見られる形式

関数呼び出し

grep -E "[a-zA-Z_][a-zA-Z0-9_]*[[:space:]]*\("

→ 関数呼び出しっぽい記述

if(while( も引っかかるため、除外する場合は (?!if|while|for|switch) のように工夫する必要あり。


📦 プリプロセッサ

インクルード

grep -E "^[[:space:]]*#include[[:space:]]+[<\"][a-zA-Z0-9_/\.]+[>\"]"

条件コンパイル

grep -E "^[[:space:]]*#(if|ifdef|ifndef|endif|else)"

#ifdef DEBUG などを検索するとデバッグコードを一括抽出できる。


📝 コメント

行コメント(C99以降)

grep -E "//"

ブロックコメント開始・終了

grep -E "/\*|\*/"

🔍 特殊な典型パターン

ポインタ変数定義

grep -E "^[[:space:]]*(int|char|float|double|long)[[:space:]]*\*+[[:space:]]*[a-zA-Z_][a-zA-Z0-9_]*"

構造体定義

grep -E "^[[:space:]]*struct[[:space:]]+[a-zA-Z_][a-zA-Z0-9_]*"

typedef

grep -E "^[[:space:]]*typedef[[:space:]]+"

⚡ TIPS

  • C言語は柔軟すぎるため、正規表現だけで完全な抽出は難しい

  • とはいえ、grepのパターンを工夫すれば リファクタリング対象の候補を洗い出す 程度には十分役立つ。

  • 大規模コードベースなら ctagscscope の導入を検討するとさらに便利。


🎯 まとめ

  • 変数定義 → 型キーワードを軸にgrep

  • 関数定義と呼び出し → ( を手がかりに抽出

  • プリプロセッサやコメント検索で コード全体の構造把握 が可能

  • 完全性よりも「ノイズを減らしつつ候補を拾う」姿勢が実用的