@trojanfoeは正しいと思います。正規表現は、9つのキャプチャグループのみを持つことができます。ただし、これは特定の例に必要な量よりも多くなります。
^\s*([+-])\s*\((\w+)\s*(\*?)\s*\)\s*(\w+)(\s*(:)\s*(\()\s*(\w+)\s*(\*?)\s*(\))\s*(\w+))?
\1 \(\2\3\)\4\6\7\8\9\10\11
私が最初に気付くのは、あなたが使用していないということです。\5
したがって、それをキャプチャする理由はまったくありません。\6
次に、これが正規表現に対応していることに気付きました。これにより、正規表現をキャプチャせずに、出力(:)
で置き換えることができます。に対応するため、出力でで置き換えることができます。...このアプローチを繰り返すと、はるかに単純な正規表現のペアが生成されます。1つは引数がゼロのメソッド用で、もう1つは引数が1つのメソッド用です。\6
:
\7
(\()
\7
(
^\s*([+-])\s*\((\w+)\s*(\*?)\s*\)\s*(\w+)
\1 \(\2\3\)\4
^([+-] \(\w+\*?\)\w+)\s*:\s*\(\s*(\w+)\s*(\*?)\s*\)\s*(\w+)
\1:\(\2\3\)\4
最初の正規表現のパスによってすでに正規化されているため、これらの[+-] \(\w+\*?\)\w+
ノイズの多いものをすべて使用せずに正規表現全体をキャプチャできることに注意してください。\s*
しかし、このアイデア全体は大きな間違いです。次のObjective-Cメソッド宣言を検討してください。
-(const char *)toString;
-(id)initWithA: (A) a andB: (B) b andC: (C) c;
-(NSObject **)pointerptr;
-(void)performBlock: (void (^)(void)) block;
-(id)stringWithFormat: (const char *) fmt, ...;
これらはいずれも、正規表現によって正しく解析されることはありません。const char
最初のものには、1つの単語ではなく2つの単語タイプが含まれています。2番目には複数のパラメーターがあります。3番目にはダブルポインタがあります。4番目は、1つの単語ではなく、非常に複雑なタイプです。5番目には、可変引数リストだけでconst char
なく、さまざまな引数リストがあります。out
パラメータ、配列、構文を使って先に進むこともでき__attribute__
ますが、正規表現がこの問題に合わない理由がわかり始めていることは確かです。
あなたが本当に探しているのはインデントプログラムです(GNUにちなんで名付けられましたindent
が、残念ながらObjective-Cは実行しません)。最もよく知られ、最もサポートされているObjective-Cインデントプログラムはuncrustify
;と呼ばれます。ここで入手してください。