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のパターンを工夫すれば リファクタリング対象の候補を洗い出す 程度には十分役立つ。
-
大規模コードベースなら
ctags
やcscope
の導入を検討するとさらに便利。
🎯 まとめ
-
変数定義 → 型キーワードを軸にgrep
-
関数定義と呼び出し →
(
を手がかりに抽出 -
プリプロセッサやコメント検索で コード全体の構造把握 が可能
-
完全性よりも「ノイズを減らしつつ候補を拾う」姿勢が実用的