0

我想使用 Xcode 的 find in project 选项来规范方法的签名。

我写了 find 表达式:

^\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

测试字符串是:

 +(NSString *) testFunction : (NSInteger ) arg1

和期望的结果:

+ (NSString*)testFunction:(NSInteger)arg1

不幸的是,Xcode 无法识别两位数捕获组 \10 并将其转换为 \1 和 '0' 字符等等。如何解决这个问题或错误?

提前致谢,

米哈乌

4

1 回答 1

0

我相信@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; 在这里得到它。

于 2012-10-24T18:40:37.140 回答