我相信@trojanfoe 是正确的;正则表达式只能有九个捕获组。不过,这比您的特定示例所需的要多。
^\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
对应于 regex (:)
,因此您可以避免捕获它并在输出中\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 的情况下捕获整个正则表达式\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
而不是单个词;第二个有多个参数;第三个有一个双指针;第四个有一个非常复杂的类型而不是一个单词;第五个不仅const char
有一个可变参数列表。我可以继续,通过out
参数和数组和__attribute__
语法,但你肯定开始明白为什么正则表达式不适合这个问题。
您真正需要的是缩进程序(以 GNU 命名indent
,不幸的是它不支持 Objective-C)。最著名和最受支持的 Objective-C 缩进程序称为uncrustify
; 在这里得到它。